我有一个64位的Linux系统。我使用gfortran编译并运行我的Fortran代码,并输出一些数字以加倍精度,即小数点后16位。 e.g。
gfortran some_code.f -o executable1
./executable1
10.1234567898765432
如果我现在使用标志-fdefault-real-8进行编译,则Fortran双精度类型被提升为16字节= 128位并且输出一些数字,但精度更高〜33位小数。 e.g。
gfortran -fdefault-real-8 some_code.f -o executable2
./executable2
10.12345678987654321234567898765432
我的问题是:如果我的电脑只有64位,那么如何以如此高的精度完成这项计算?
答案 0 :(得分:1)
首先,CPU为64位的事实意味着它使用64位指针(内存地址)。它与浮点变量大小没有任何关系。 32位CPU(甚至16位!)使用64位浮点数和整数就好了。 1
128位浮点数用软件实现,它是一种仿真"一个128位浮点处理器单元,它实际上非常慢。这不是因为您的CPU是64位,而是因为CPU的浮点单元仅实现64位浮点运算。即使在英特尔的32位CPU中也是如此。
为GCC实现128位计算的库是libquadmath。
1 实际上,浮点位操作是在浮点单元(FPU)中完成的。它曾经是一个与CPU分离的特殊芯片,但现在它们总是集成在英特尔消费者处理器中。在过去,如果你没有购买单独的FPU,所有浮点运算都被模拟并且速度很慢。