2

想要不那么精确的人会写

999    format ('The answer is x = ', F8.3)

其他想要更高输出精度的人可以写

999 format ('The answer is x = ', F18.12)

因此,它完全取决于用户想要什么。与计算中使用的精度完全匹配的格式语句是什么?(注意,这可能因系统而异)

4

2 回答 2

3

这是一个难题,因为您要求“计算的精度”,这取决于很多因素。例如:如果我通过牛顿法求解 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 位)

于 2013-04-26T04:37:24.030 回答
-1

浮点数的问题在于没有精度:只有有效数字。

例如,如果您在英国附近以实际*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 个有效数字。

于 2013-04-26T18:16:34.150 回答