1

我有一个输入文件,第一行包含以下小数。

0.5053102074297753

我有一个 Fortran 90 程序,它读取文件并输出值。

read(*,*) answer
write(*,"(F20.16)") answer

这是输出:

0.5053101778030396

显然,存储的内容与读取的内容不同。问题是,为什么?

4

2 回答 2

2

答案是如何声明的?如果它是单精度实数,您只能期望大约 6 位小数的精度。

此外,值被转换为二进制用于内部存储和计算。这可能会导致舍入和其他问题,但这里的差异太大而不会成为原因。

要将 answer 声明为双精度,请使用以下命令:

integer, parameter :: DRK = selected_real_kind (14)
real (kind=DRK) :: answer

这将保证答案至少有 14 个十进制数字。“DRK”可以在整个程序中使用。根据您的编译器,您可以尝试要求更多的数字......它可能会提供这样的类型。很少需要超过双精度。

于 2010-09-24T16:10:44.347 回答
2

每个计算机科学家都应该知道的关于浮点运算的知识

默认的实际精度不足以在小数部分存储小数点后 16 位的数字。

于 2010-09-24T16:14:56.343 回答