User Tools

Site Tools


ugbasic:user:example:maths_relative_03
Translations of this page:


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

HOW TO COMPILE AND RUN

The instructions here refer to compiling the example from the command line. For Microsoft Windows users we suggest using 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, open an issue for this example on GitHub. Thank you!

POWERED BY