1

使用 gfortran 编译器,标志 -fdefault-real-16 有助于将默认实类型设置为 16 字节宽的类型。例如

program qp_test
implicit none 
      double precision  :: a    
      a  = 123456789012345678.123456789012345678
      write(*,'(a,g41.36)') 'my a    = ',a
      write(*,'(a)')        'exact a = 123456789012345678.123456789012345678'
end program 

何时遵守

gfortran qp_test.f90

结果看起来像

my a    = 123456790519087104.000000000000000000    
exact a = 123456789012345678.123456789012345678 

当编译为

gfortran qp_test.f90 -fdefault-real-16

结果看起来像

my a    = 123456789012345678.123456789012345677    
exact a = 123456789012345678.123456789012345678 

所以,我尝试对 c 程序做同样的事情

#include<stdio.h>
#include<string.h>
int main() {
   double a;
   a  = 123456789012345678.123456789012345678;           
   printf("my a    = %36.18f\n", a);
   printf("exact a = 123456789012345678.123456789012345678\n");
   return 0;
}

问题是:即使c程序编译时带有-m64标志,例如

gcc qp_test.c -o qp_test_c -m64

它给出了相同的结果

my a    = 123456789012345680.000000000000000000
exact a = 123456789012345678.123456789012345678

问题是:是否有一些方法可以告诉 gcc 将“double”编译为“long double”?

4

0 回答 0