想要不那么精确的人会写
999 format ('The answer is x = ', F8.3)
其他想要更高输出精度的人可以写
999 format ('The answer is x = ', F18.12)
因此,它完全取决于用户想要什么。与计算中使用的精度完全匹配的格式语句是什么?(注意,这可能因系统而异)
这是一个难题,因为您要求“计算的精度”,这取决于很多因素。例如:如果我通过牛顿法求解 f(x)=0 到 1E-6 的容差,你想要一个七位数的格式吗?
另一方面,如果您的意思是“该类型可达到的最高精度”(例如,双精度或单精度),那么您可以简单地找到相应的 epsilon(机器 eps 或精度)并将其用作格式标志。如果 epsilon 是 1E-15,那么您可以使用不超过 16 位的格式标志。
在 Fortran 中,您可以使用 EPSILON(X) 函数来获取此数字(答案将取决于 X 的类型),您可以取 epsilon 的对数(以 10 为底)的绝对值的下限,并使其浮点表示中的小数位数。
例如,如果 epsilon 是 1E-12,log 是 -12,abs 是 12,而 floor 是 12,那么您需要像 15.12F 这样的格式(12 位小数 + 1 点 + 零 + 符号 = 15 位)
浮点数的问题在于没有精度:只有有效数字。
例如,如果您在英国附近以实际*1 计算经度,则可以精确到小数点后 6 位,但如果您在科罗拉多斯普林斯,则只能精确到小数点后 4 位。以 F 格式打印数字没有任何意义,它只是小数点后第四位的垃圾。
如果您希望打印到最大精度,请以 E 格式打印。因为它总是 n.nn..nEnn,所以你会得到所有的有效数字。
编辑 - user4050 的查询 试试下面的例子
program main
real intpart, multiplier
integer ii
multiplier = 1
do ii = 1, 6
intpart = 9.87654321
intpart = intpart * multiplier
print '(F15.7 E15.7 G15.8)', intpart, intpart, intpart
multiplier = multiplier * 10
end do
stop
end program
你会得到类似的东西
9.8765430 0.9876543E+01 9.8765430
98.7654266 0.9876543E+02 98.765427
987.6542969 0.9876543E+03 987.65430
9876.5429688 0.9876543E+04 9876.5430
98765.4296875 0.9876543E+05 98765.430
987654.3125000 0.9876543E+06 987654.31
请注意,随着数字变大,精度会发生变化,因为浮点数只有 7 个有效数字。