1
QB64 Discussion / Errors because some DOUBLE PRECISION numbers are wrong
« on: April 09, 2022, 10:57:41 am »
Below please see a QB64 program that evokes mathematical errors in some DOUBLE PRECISION numbers. In particular, PRINT 1.D-40 produces 1.D-41, which is ten times smaller than the correct answer 1.D-40.
Here is the test program:
Data 1D-40#,1E-40
Read x#, y!
Print .0000000000000000000000000000000000000001#: Rem: 1D-41 is the result
Print 1# / 10000000000000000000000000000000000000000#: Rem: 1D-41 is the result
Print x#
Print 10000000000000000000000000000000000000000#: Rem: 1D+40 is the result
Print 1# / 10000#: Rem: .0001 is the result
Print .0001#: Rem: .0001 is the result
Print 1D0 / 1.D40: Rem: 1D-41 is the result
Print 1D-40: Rem: 1D-41 is the result
Print 1D0 / 1D20: Rem: 1D-21 is the result
Print 1D-20: Rem: 1D-21 is the result
Print 1D0 / 1D19: Rem: 1D-19 is the result
Print 1D-19: Rem: 1D-19 is the result
Print 0.0000000000000000000000000000000000000001: Rem: 1D-41 is the result
Print 1 / 10000000000000000000000000000000000000000.: Rem: 1D-41 is the result
Print y!: Rem: 9.999946E-41 is the result
Print 10000000000000000000000000000000000000000.: Rem: 1D+40 is the result
Print 1 / 10000: Rem: .0001 is the result
Print .0001: Rem: .0001 is the result
Print 1E0 / 1E40: Rem: 9.999946E-41 is the result
Print 1E-40: Rem: 9.999946E-41 is the result
Print 1E0 / 1E20: Rem: .0001 is the result
Print 1E-20: Rem: .0001 is the result
Print 1E0 / 1E19: Rem: 1D-19 is the result
Print 1E-19: Rem: 1D-19 is the result
End
Note that 1D-19 prints correctly but 1D-20 does not. SINGLE precision seems to work ok.
It may make a difference if the decimal point is included in some of the numbers, for instance, 1.D-40 instead of 1.D-40. However, the errors may be worse.
Please fix this problem.
Sincerely yours,
Dr. Edwin L. Kerr, Retired NASA physicist and engineer with 60 years of computer programming experience.
Here is the test program:
Data 1D-40#,1E-40
Read x#, y!
Print .0000000000000000000000000000000000000001#: Rem: 1D-41 is the result
Print 1# / 10000000000000000000000000000000000000000#: Rem: 1D-41 is the result
Print x#
Print 10000000000000000000000000000000000000000#: Rem: 1D+40 is the result
Print 1# / 10000#: Rem: .0001 is the result
Print .0001#: Rem: .0001 is the result
Print 1D0 / 1.D40: Rem: 1D-41 is the result
Print 1D-40: Rem: 1D-41 is the result
Print 1D0 / 1D20: Rem: 1D-21 is the result
Print 1D-20: Rem: 1D-21 is the result
Print 1D0 / 1D19: Rem: 1D-19 is the result
Print 1D-19: Rem: 1D-19 is the result
Print 0.0000000000000000000000000000000000000001: Rem: 1D-41 is the result
Print 1 / 10000000000000000000000000000000000000000.: Rem: 1D-41 is the result
Print y!: Rem: 9.999946E-41 is the result
Print 10000000000000000000000000000000000000000.: Rem: 1D+40 is the result
Print 1 / 10000: Rem: .0001 is the result
Print .0001: Rem: .0001 is the result
Print 1E0 / 1E40: Rem: 9.999946E-41 is the result
Print 1E-40: Rem: 9.999946E-41 is the result
Print 1E0 / 1E20: Rem: .0001 is the result
Print 1E-20: Rem: .0001 is the result
Print 1E0 / 1E19: Rem: 1D-19 is the result
Print 1E-19: Rem: 1D-19 is the result
End
Note that 1D-19 prints correctly but 1D-20 does not. SINGLE precision seems to work ok.
It may make a difference if the decimal point is included in some of the numbers, for instance, 1.D-40 instead of 1.D-40. However, the errors may be worse.
Please fix this problem.
Sincerely yours,
Dr. Edwin L. Kerr, Retired NASA physicist and engineer with 60 years of computer programming experience.