{{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 |}}]]