使用 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”?