{{htmlmetatags>metatag-robots=() metatag-title=(MATHEMATIC ROUTINES LIMITS OF NUMERIC TYPES | ugBASIC User Manual) metatag-keywords=(ugBASIC,Commodore 64,Commodore PLUS/4,ZX Spectrum) metatag-description=(An isomorphic language for retrocomputers) metatag-media-og:image=(:ugbasic:logo-ugbasic-fb.png) metatag-og:title=(MATHEMATIC ROUTINES LIMITS OF NUMERIC TYPES | ugBASIC User Manual) metatag-og:description=(An isomorphic language for retrocomputers) }} ====== ugBASIC User Manual ====== ===== MATHEMATIC ROUTINES LIMITS OF NUMERIC TYPES ===== ==== PURPOSE ==== This example attempts to show the behavior of the system when dealing with conversion between types, signed or unsigned. The rule that ugBASIC uses is the minimum error rule: in general, if the destination type has a sufficient number of bits, it is possible to represent the information without losses. If the destination type has fewer bits, the number is guaranteed to be represented correctly if the number of destination bits are sufficient. In case of signed types, if the source number is negative but the destination type is unsigned, the value will be set to the absolute value without sign. ==== SOURCE CODE ==== PROCEDURE example ON ALL BUT VIC20 CLS ' ****************************************************************** ' ******** destination: signed byte ******************************** ' ****************************************************************** DIM sb AS SIGNED BYTE ' source underflow -> destination underflow ' ' -42 = 11010110 -> 11010110 -> -42 sb = -42 PRINT "signed byte(-42) = "; sb; " (exp ";"-42";" )" ' source overflow [with unsigned byte] -> destination approximation ' ' 200 = 11001000 -> 01001000 -> +72 sb = 200 PRINT "signed byte(200) = "; sb; " (exp ";"72";" )" ' source overflow [with signed word] -> destination approximation ' ' -500 = 1111111000001100 -> 000111110100 -> 11110100 -> -116 sb = -500 PRINT "signed byte(-500) = "; sb; " (exp ";"-116";" )" ' source overflow [with unsigned word] -> destination approximation ' ' 20000 = 0100111000100000 -> 00100000 -> +32 sb = 20000 PRINT "signed byte(20000) = "; sb; " (exp ";"32";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 sb = -100500 PRINT "signed byte(-100500) = "; sb; " (exp ";"-20";" )" ' source overflow [with unsigned dword] -> destination approximation sb = 10020000 PRINT "signed byte(10020000) = "; sb; " (exp ";"32";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ****************************************************************** ' ******** destination: unsigned byte ****************************** ' ****************************************************************** DIM b AS BYTE ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 b = 42 PRINT "byte(42) = "; b; " (exp ";"42";" )" ' source overflow [with unsigned byte] -> destination unsigned ' ' -42 = 11010110 -> 01001000 -> +42 b = -42 PRINT "byte(-42) = "; b; " (exp ";"42";" )" ' source overflow [with signed word] -> destination approximation ' ' -500 = 1111111000001100 -> 000111110100 -> 11110100 -> -116 b = -500 PRINT "byte(-500) = "; b; " (exp ";"12";" )" ' source overflow [with unsigned word] -> destination approximation ' ' 20000 = 0100111000100000 -> 00100000 -> +32 b = 20000 PRINT "byte(20000) = "; b; " (exp ";"32";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 b = -100500 PRINT "byte(-100500) = "; b; " (exp ";"148";" )" ' source overflow [with unsigned dword] -> destination approximation b = 10020000 PRINT "byte(10020000) = "; b; " (exp ";"160";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' **************************************************************** ' ******** destination: signed word ****************************** ' **************************************************************** DIM sw AS SIGNED WORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 sw = 42 PRINT "signed word(42) = "; sw; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 sw = -42 PRINT "signed word(-42) = "; sw; " (exp ";"-42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 sw = -500 PRINT "signed word(-500) = "; sw; " (exp ";"-500";" )" ' source overflow [with unsigned word] -> destination approximation ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 sw = 40000 PRINT "signed word(40000) = "; sw; " (exp ";"7232";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 sw = -100500 PRINT "signed word(-100500) = "; sw; " (exp ";"-2196";" )" ' source overflow [with unsigned dword] -> destination approximation sw = 10020000 PRINT "signed word(10020000) = "; sw; " (exp ";"25760";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ****************************************************************** ' ******** destination: unsigned word ****************************** ' ****************************************************************** DIM w AS WORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 w = 42 PRINT "word(42) = "; w; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 w = -42 PRINT "word(-42) = "; w; " (exp ";"42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 w = -500 PRINT "word(-500) = "; w; " (exp ";"500";" )" ' source overflow [with unsigned word] -> destination underflow ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 w = 40000 PRINT "word(40000) = "; w; " (exp ";"40000";" )" ' source overflow [with signed dword] -> destination approximation ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 w = -100500 PRINT "word(-100500) = "; w; " (exp ";"30752";" )" ' source overflow [with unsigned dword] -> destination approximation w = 10020000 PRINT "word(10020000) = "; w; " (exp ";"58528";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ***************************************************************** ' ******** destination: signed dword ****************************** ' ***************************************************************** DIM dw AS SIGNED DWORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 dw = 42 PRINT "signed dword(42) = "; dw; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 dw = -42 PRINT "signed dword(-42) = "; dw; " (exp ";"-42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 dw = -500 PRINT "signed dword(-500) = "; dw; " (exp ";"-500";" )" ' source underflow [with unsigned word] -> destination underflow ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 dw = 40000 PRINT "signed dword(40000) = "; dw; " (exp ";"40000";" )" ' source underflow [with signed dword] -> destination underflow ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 dw = -100500 PRINT "signed dword(-100500) = "; dw; " (exp ";"-100500";" )" ' source underflow [with unsigned dword] -> destination approximation dw = 10020000 PRINT "signed dword(10020000) = "; sw; " (exp ";"25760";" )" ' ****************************************************************** ' ****************************************************************** ' ****************************************************************** WAIT KEY RELEASE : PRINT ' ****************************************************************** ' ******** destination: unsigned word ****************************** ' ****************************************************************** DIM udw AS DWORD ' source underflow -> destination underflow ' ' 42 = 11010110 -> 11010110 -> 42 udw = 42 PRINT "unsigned dword(42) = "; udw; " (exp ";"42";" )" ' source underflow [with unsigned byte] -> destination underflow ' ' -42 = 11010110 -> -42 udw = -42 PRINT "unsigned dword(-42) = "; udw; " (exp ";"42";" )" ' source underfow [with signed word] -> destination underflow ' ' -500 = 1111111000001100 -> -500 udw = -500 PRINT "unsigned dword(-500) = "; udw; " (exp ";"500";" )" ' source underflow [with unsigned word] -> destination underflow ' ' 40000 = 0100111000100000 -> 00100000 -> 7232 udw = 40000 PRINT "unsigned dword(40000) = "; udw; " (exp ";"40000";" )" ' source underflow [with signed dword] -> destination underflow ' ' -100500 = 11111111111111100111011101101100 -> 00011000100010010100 -> 10010100 udw = -100500 PRINT "unsigned dword(-100500) = "; udw; " (exp ";"-100500";" )" ' source underflow [with unsigned dword] -> destination underflow udw = 10020000 PRINT "unsigned dword(10020000) = "; udw; " (exp ";"10020000";" )" END PROCEDURE example[] ON ALL BUT VIC20 ==== SOURCE FILE ==== * ''[[https://github.com/spotlessmind1975/ugbasic/tree/main/examples/maths_relative_03.bas|maths_relative_03.bas]]'' ==== HOW TO COMPILE AND RUN ==== The instructions here refer to compiling the example from the command line. For Microsoft Windows users we suggest using **[[https://spotlessmind1975.itch.io/ugbasic-ide|UGBASIC-IDE]]**, which allows you to compile the example with just one click.=== ATARI 400/800 family === In order to compile and run the example, you need to have the Altirra emulator, and in particular that the ''altirra'' executable is accessible. Then, type this command on the command line: # Linux ugbc.atari maths_relative_03.bas -o example.xex altirra example.xex # Windows ugbc.atari.exe maths_relative_03.bas -o example.xex altirra example.xex === ATARI 600XL/800XL/1200XL/XG(SE) family === In order to compile and run the example, you need to have the Altirra emulator, and in particular that the ''altirra'' executable is accessible. Then, type this command on the command line: # Linux ugbc.atarixl maths_relative_03.bas -o example.xex altirra example.xex # Windows ugbc.atarixl.exe maths_relative_03.bas -o example.xex altirra example.xex === Commodore 64 === In order to compile and run the example, you need to have the VICE emulator, and in particular that the ''x64sc'' executable is accessible. Then, type this command on the command line: # Linux ugbc.c64 maths_relative_03.bas -o example.prg x64sc example.prg # Windows ugbc.c64.exe maths_relative_03.bas -o example.prg x64sc example.prg === Commodore 64+REU === In order to compile and run the example, you need to have the VICE emulator, and in particular that the ''x64sc'' executable is accessible. Then, type this command on the command line: # Linux ugbc.c64reu maths_relative_03.bas -o example.prg x64sc -reu example.prg # Windows ugbc.c64reu.exe maths_relative_03.bas -o example.prg x64sc -reu example.prg === Commodore PLUS/4 === == Using YAPE == In order to run the example, you need to have the YAPE emulator. In particular that the ''yape'' executable is accessible. Then, type this command on the command line: # Linux ugbc.plus4 maths_relative_03.bas -o example.prg yape example.prg # Windows ugbc.plus4.exe maths_relative_03.bas -o example.prg yape example.prg == Using VICE == In order to run the example, you need to have the VICE emulator. In particular that the ''xplus4'' executable is accessible. Then, type this command on the command line: # Linux ugbc.plus4 maths_relative_03.bas -o example.prg xplus4 example.prg # Windows ugbc.plus4.exe maths_relative_03.bas -o example.prg xplus4 example.prg === Dragon 32 === In order to compile and run the example, you need to have the XROAR emulator, and in particular that the ''xroar'' executable is accessible. Then, type this command on the command line: # Linux ugbc.d32 maths_relative_03.bas -o example.bin xroar -rompath (your rom path) example.bin # Windows ugbc.d32.exe maths_relative_03.bas -o example.bin xroar.exe -rompath (your rom path) example.bin === Dragon 64 === In order to compile and run the example, you need to have the XROAR emulator, and in particular that the ''xroar'' executable is accessible. Then, type this command on the command line: # Linux ugbc.d64 maths_relative_03.bas -o example.bin xroar -rompath (your rom path) example.bin # Windows ugbc.d64.exe maths_relative_03.bas -o example.bin xroar.exe -rompath (your rom path) example.bin === PC128 Olivetti Prodest === In order to compile and run the example, you need to have the DCMOTO emulator, and in particular that the ''dcmoto'' executable is accessible. Then, type this command on the command line and on the emulator: # Linux ugbc.pc128op maths_relative_03.bas -o example.k7 dcmoto (choose BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC # Windows ugbc.pc128op.exe maths_relative_03.bas -o example.k7 dcmoto (choose example.k7) (choose BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC === Thomson MO5 === In order to compile and run the example, you need to have the DCMOTO emulator, and in particular that the ''dcmoto'' executable is accessible. Then, type this command on the command line and on the emulator: # Linux ugbc.pc128op maths_relative_03.bas -o example.k7 dcmoto (choose BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC # Windows ugbc.pc128op.exe maths_relative_03.bas -o example.k7 dcmoto (choose example.k7) (choose BASIC 128) CLEAR,&H2FFF: LOADM"CASS:",R: EXEC === Commodore VIC-20 === In order to compile and run the example, you need to have the VICE emulator, and in particular that the ''xvic'' executable is accessible. Then, type this command on the command line: # Linux ugbc.vic20 maths_relative_03.bas -o example.prg xvic --memory 24k example.prg # Windows ugbc.vic20.exe maths_relative_03.bas -o example.prg xvic --memory 24k example.prg === ZX Spectrum === In order to compile and run the example, you need to have the Speccy emulator, and in particular that the ''speccy'' executable is accessible. Then, type this command on the command line: # Linux ugbc.zx maths_relative_03.bas -o example.tap Speccy example.tap # Windows ugbc.zx.exe maths_relative_03.bas -o example.tap Speccy example.tap === MSX === In order to compile and run the example, you need to have the openMsx or the BlueMSX emulator, and in particular that its executable is accessible. Then, type this command on the command line: == openMSX == # Linux ugbc.msx1 maths_relative_03.bas -o example.rom openmsx -cart example.rom # Windows ugbc.msx1.exe maths_relative_03.bas -o example.rom openmsx -cart example.rom == blueMSX == # Linux ugbc.msx1 maths_relative_03.bas -o example.rom bluemsx example.rom # Windows ugbc.msx1.exe maths_relative_03.bas -o example.rom bluemsx example.rom === ColecoVision === In order to compile and run the example, you need to have the openMsx or the BlueMSX emulator, and in particular that its executable is accessible. Then, type this command on the command line: == openMSX == # Linux ugbc.coleco maths_relative_03.bas -o example.rom openmsx -machine \"COL - ColecoVision\" -cart example.rom # Windows ugbc.coleco.exe maths_relative_03.bas -o example.rom bluemsx -machine \"COL - ColecoVision\" example.rom == blueMSX == # Linux ugbc.coleco maths_relative_03.bas -o example.rom bluemsx /machine \"COL - ColecoVision\" /rom1 example.rom # Windows ugbc.coleco.exe maths_relative_03.bas -o example.rom bluemsx /machine \"COL - ColecoVision\" /rom1 example.rom === SEGA SC-3000 === In order to compile and run the example, you need to have the BlueMSX emulator, and in particular that its executable is accessible. Then, type this command on the command line: # Linux ugbc.sc3000 maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SC-3000\" /rom1 example.rom # Windows ugbc.sc3000.exe maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SC-3000\" /rom1 example.rom === SEGA SG-1000 === In order to compile and run the example, you need to have the BlueMSX emulator, and in particular that its executable is accessible. Then, type this command on the command line: # Linux ugbc.sg1000 maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SG-1000\" /rom1 example.rom # Windows ugbc.sg1000.exe maths_relative_03.bas -o example.rom bluemsx /machine \"SEGA - SG-1000\" /rom1 example.rom ==== ANY PROBLEM? ==== If you have found a problem trying to run this example, if you think there is a bug or, more simply, you would like it to be improved, [[https://github.com/spotlessmind1975/ugbasic/issues/new?title=IMPROVE MATHEMATIC ROUTINES LIMITS OF NUMERIC TYPES|open an issue]] for this example on GitHub. Thank you!===== POWERED BY ===== [[:ugbasic:user:examples|{{ :ugbasic:user:logo-ugbasic.png?nolink&600 |}}]]