Microsoft KB Archive/45421
Article ID: 45421
Article Last Modified on 1/8/2003
- Microsoft QuickBasic Compiler for Macintosh 1.0
This article was previously published under Q45421
In the interpreter in QuickBASIC (b) for Macintosh, assigning a single-precision constant (directly or through the VAL function) to a double-precision variable can give you extra garbage digits past the seventh significant digit, while the same program gives no garbage digits when compiled. This is not a software problem, but is the way the binary math interpreter implements floating-point type conversion.
In binary math, to force constants that have a decimal point and seven or fewer digits to higher precision, you must append a number sign (#) character to the constant. Then, assigning that constant to a double-precision variable will convert with double precision (up to 15 significant digits).
This information applies to the binary math versions of Microsoft BASIC (b) Interpreter Versions 2.00, 2.10, and 3.00 and to Microsoft QuickBASIC (b) Version 1.00 for the Apple Macintosh.
Note: The decimal math (d) version of BASIC is more accurate (but slower) than binary math, and type conversions in decimal math are done exactly without showing this behavior.
To demonstrate the type conversion behavior in binary math, run the following program in the interpreter in QuickBASIC (b):
B$ = "8190.844" ' Must change to "8190.844#" for better precision. A# = VAL(B$) C# = 8190.844 ' Must change to 8190.844# for better precision. PRINT A# PRINT C# PRINT VAL(B$)
The following results print from the QuickBASIC (b) interpreter:
8190.84423828125 <-- accurate only to 7 digits (single precision) 8190.84423828125 <-- accurate only to 7 digits (single precision) 8190.844 <-- a single-precision constant
The following results come from the program compiled in QuickBASIC (b):
8190.844 <-- accurate only to 7 digits (single precision) 8190.84375 <-- accurate only to 7 digits (single precision) 8190.844 <-- a single-precision constant
To avoid accumulation of nonsignificant digits when converting a single-precision constant to double precision, you should type-cast the constant with # or add trailing zeros to make it longer than seven digits.
Additional query words: MQuickB