Small Basic: Overflow
This article explains about overflow especially for Small Basic programmer.
Overflow
In a computer, a number will be contained in a limited size of memory. The size depends on it's data type. Microsoft Small Basic is one of the .NET framework programming language. Internally, Small Basic uses some of those data (variable) type such as Decimal, Double, Int32 and so on. So, if a number is larger than the memory size, overflow occurs when assigning.
Number | Description |
"-79228162514264337593543950336" | Treated as text (not number) - becomes zero for math calculation |
"-79228162514264337593543950335" | Can be assigned as literal text, Decimal exception with operations |
-79228162514264333200000000000 | Decimal exception at assigning as literal number |
-79228162514264333199999999999 | Can be assigned as literal number, value rounded as -79228162514264300000000000000 |
"-79228162514264333195497438208" | Can be assigned as literal text, Decimal exception with operations |
"-79228162514264333195497438207" | Can be assigned as literal text |
-79228162514264300000000000001 | Can be assigned as literal number, value rounded as -79228162514264300000000000000 |
-79228162514264300000000000000 | Can be assigned as literal number |
-0.0000000000000000000000000001 | Can be assigned as literal number |
-0.000000000000000000000000000099999999999999999 | Can be assigned as literal number, value rounded as -0.0000000000000000000000000001 |
-0.000000000000000000000000000050000000000000007 | Can be assigned as literal number, value rounded as -0.0000000000000000000000000001 |
-0.000000000000000000000000000050000000000000006 | Value rounded as 0 |
0.000000000000000000000000000050000000000000006 | Value rounded as 0 |
0.000000000000000000000000000050000000000000007 | Can be assigned as literal number, value rounded as 0.0000000000000000000000000001 |
0.000000000000000000000000000099999999999999999 | Can be assigned as literal number, value rounded as 0.0000000000000000000000000001 |
0.0000000000000000000000000001 | Can be assigned as literal number |
2147483648 | Available with Math.GetRandomNumber() |
2147483649 | Int32 exception with Math.GetRandomNumber() |
79228162514264300000000000000 | Can be assigned as literal number |
79228162514264300000000000001 | Can be assigned as literal number, value rounded as 79228162514264300000000000000 |
"79228162514264333195497438207" | Can be assigned as literal text |
"79228162514264333195497438208" | Can be assigned as literal text, Decimal exception with operations |
79228162514264333199999999999 | Can be assigned as literal number, value rounded as 79228162514264300000000000000 |
79228162514264333200000000000 | Decimal exception at assigning as literal number |
"79228162514264337593543950335" | Can be assigned as literal text, Decimal exception with operations |
"79228162514264337593543950336" | Treated as text (not number) - becomes zero for math calculation |
Decimal Overflow
Decimal is a real number data type. Small Basic uses Decimal for variables and parameters of many operations.
Decimal allows from -79228162514264337593543950335 (-2^96+1) to 79228162514264337593543950335 (2^96-1). And the nearest numbers to zero are -0.0000000000000000000000000001 (-1E-28) and 0.0000000000000000000000000001 (1E-28).
Literal Assignment
Following code assigns the numbers as texts. These numbers are smaller or larger than Decimal significand.
number = "-79228162514264337593543950336"
TextWindow.WriteLine(number - 1) ' -1
TextWindow.WriteLine(number + 0) ' -792281625142643375935439503360
TextWindow.WriteLine(number + 1) ' -792281625142643375935439503361
number = "79228162514264337593543950336"
TextWindow.WriteLine(number - 1) ' -1
TextWindow.WriteLine(number + 0) ' 792281625142643375935439503360
TextWindow.WriteLine(number + 1) ' 792281625142643375935439503361
Following code occurs exception errors and the program will end.
number = -79228162514264333200000000000 ' Error
number = 79228162514264333200000000000 ' Error
Following code assigns the numbers to the variables properly.
number = "-79228162514264333195497438207"
TextWindow.WriteLine(number) ' -79228162514264333195497438207
number = -79228162514264300000000000000
TextWindow.WriteLine(number) ' -79228162514264300000000000000
number = 79228162514264300000000000000
TextWindow.WriteLine(number) ' 79228162514264300000000000000
number = "79228162514264333195497438207"
TextWindow.WriteLine(number) ' 79228162514264333195497438207
Operation Call
Following code occurs exception errors and the program will end.
number = "79228162514264333195497438208"
TextWindow.WriteLine(Math.Abs(number)) ' Error
TextWindow.WriteLine(Math.Floor(number)) ' Error
TextWindow.WriteLine(Math.Ceiling(number)) ' Error
TextWindow.WriteLine(Math.Round(number)) ' Error
TextWindow.WriteLine(Math.Max(number, number)) ' Error
TextWindow.WriteLine(Math.Min(number, number)) ' Error
Double Overflow
Double is a 64-bit real data type. Double allows from -1.79769313486232e308 to 1.79769313486232e308.
Following code assigns the numbers to the variables, but some overflows occur and the numbers will be rounded. Decimal significand has 29 digits. But Double significand has 15 digits. This rounding must be caused by Double overflow.
number = -79228162514264333199999999999
TextWindow.WriteLine(number) ' -79228162514264300000000000000
number = 79228162514264333199999999999
TextWindow.WriteLine(number) ' 79228162514264300000000000000
Int32 Overflow
Int32 is a 32-bit integer data type. Math.GetRandomNumber() operation uses Int32 internally.
Int32 allows from -2147483648 (-2^31) to 2147483647 (2^31-1) . If the parameter of Math.GetRandomNumber() is out of the latter range, following error occurs.
TextWindow.WriteLine(Math.GetRandomNumber(2147483648)) ' Error