Share via


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

See Also