2017-07-25 137 views
0

我有一個64位的Linux系統。我使用gfortran編譯並運行我的Fortran代碼,並輸出一些數字以達到雙精度,即〜16位小數。例如運行64位計算機的128位Fortran計算

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位?

+1

這是所有(可能)軟件。你甚至可以有更高的精度(數百萬比特)。這一切都取決於正在使用的軟件/算法。精度越高,過程越慢,儘管許多可能的技巧和算法可以加快速度。 CPU是64位的事實與此無關。這也可以在32位或16位處理器上完成。 –

+0

如果可能,雙精度提升爲128位*。更有可能的是,它在x86等典型現代硬件上仍將保持64位。 – Netch

回答

1

首先,您的CPU是64位的事實意味着它使用64位指針(內存地址)。它與浮點變量大小沒有任何關係。 32位CPU(甚至16位!)使用64位浮點數和整數就好了。

128位浮點數是用軟件實現的,它是128位浮點處理器單元的一種「仿真」,實際上它非常慢。這不是因爲你的CPU是64位的,而是因爲CPU的浮點單元只實現了64位浮點運算。即使在英特爾的32位CPU中也是如此。

對於GCC實現128位計算的庫是libquadmath


實際上,浮點比特操作在浮點單元(FPU)來完成。它曾經是一種與CPU分離的特殊芯片,但現在它們總是集成在英特爾消費類處理器中。在過去,如果你沒有購買獨立的FPU,全部浮點運算被模擬和緩慢。

+0

嗯有趣,所以64位處理器可以模擬使用64位算法的128位算術?這就是爲什麼128位會很慢? – user1887919

+2

不管它是32位處理器還是64位處理器,甚至是16位處理器。你感興趣的是浮點單元。英特爾CPU具有支持32位和64位IEEE浮點數的浮點單元。其他類型的浮點數必須用軟件實現。是的,它是緩慢的。 –