0

我有一个 64 位的 linux 系统。我使用 gfortran 编译并运行我的 Fortran 代码,这会将一些数字输出为双精度,即 ~ 16 位小数。例如

gfortran some_code.f -o executable1
./executable1
10.1234567898765432

如果我现在使用标志-fdefault-real-8进行编译,则 Fortran 双精度类型将提升为 16 字节 = 128 位并输出一些数字,但精度更高 ~ 33 位小数。例如

gfortran -fdefault-real-8 some_code.f -o executable2
./executable2
10.12345678987654321234567898765432

我的问题是:如果我的计算机只有 64 位,这个计算怎么能做到如此高精度?

4

1 回答 1

1

首先,您的 CPU 是 64 位这一事实意味着它使用 64 位指针(内存地址)。它与浮点变量大小完全无关。32 位 CPU(甚至 16 位!)使用 64 位浮点数和整数就好了。1

128 位浮点数是在软件中实现的,它是一种 128 位浮点处理器单元的“模拟”,实际上非常慢。这不是因为你的 CPU 是 64 位的,而是因为 CPU 的浮点单元只实现了 64 位的浮点运算。即使在英特尔的 32 位 CPU 中也是如此。

为 GCC 实现 128 位计算的库是libquadmath


1实际上,浮点位操作是在浮点单元(FPU)中完成的。它曾经是与 CPU 分离的特殊芯片,但现在它们总是集成在 Intel 消费级处理器中。在过去,如果您不购买单独的 FPU,所有浮点运算都是模拟的并且速度很慢。

于 2017-07-25T08:55:12.780 回答