我有一个输入文件,第一行包含以下小数。
0.5053102074297753
我有一个Fortran 90程序,它读取文件并输出值。
read(*,*) answer
write(*,"(F20.16)") answer
这是输出:
0.5053101778030396
显然,存储的内容与读取的内容不同。问题是,为什么?
答案 0 :(得分:2)
如何回答声明?如果它是单精度实数,则只能得到大约6位十进制数字。
此外,将值转换为二进制以进行内部存储和计算。这可能会导致舍入和其他问题,但这里的差异太大,无法成为原因。
要将答案声明为双精度,请使用以下命令:
integer, parameter :: DRK = selected_real_kind (14)
real (kind=DRK) :: answer
这将保证答案至少有14位小数。 “DRK”可以在整个程序中使用。根据您的编译器,您可以尝试询问更多数字......它可能提供这样的类型。很少需要超过双精度。
答案 1 :(得分:2)
What Every Computer Scientist Should Know About Floating-Point Arithmetic。
默认的实际精度不足以存储小数部分中包含16位小数的数字。