为什么在Fortran和C中以不同的方式打印相同的浮点常量?

vit*_*aut 1 c floating-point fortran

0.8804418在Fortran中打印常量

   program hello
      print *, 0.8804418
   end program hello
Run Code Online (Sandbox Code Playgroud)

给出0.880441785了C版本

#include <stdio.h>

int main() {
  printf("%.10g", 0.8804418);
}
Run Code Online (Sandbox Code Playgroud)

0.8804418在同一系统上打印(带有gfortran和gcc的Linux x86-64).为什么输出不同?请注意,提高精度printf并不会改变输出.

这不是浮点数学的重复吗?或类似的.这个问题具体是关于Fortran和C表示(或格式化)的差异.

das*_*ght 5

默认情况下,Fortran的REAL数字常量是单精度的 ; 但是,在C中,浮点文字具有精度.

当您转换0.8804418为单精度然后将其打印为doubleC时,您将被0.8804417849打印(演示)

float x = 0.8804418f;
printf("%.10g\n", x);
Run Code Online (Sandbox Code Playgroud)

Fortran的打印输出似乎是相同的数字.

Fortran的双精度REAL数字语法使用后缀d:

print *, 0.8804418d+0
Run Code Online (Sandbox Code Playgroud)

这打印0.88044180000000005(演示).