1

加倍假設我們的平臺,其中類型long double具有比64個比特的嚴格更高的精度上工作。將給定的long double轉換爲普通雙精度數的最快方法是什麼?使用一些規定的舍入(向上,向下,從最近到最近等)?轉換一個長雙用向上(或向下)四捨五入

爲了使問題更準確,讓我舉一個具體的例子:讓N是一個給定的long double,並且M是其價值(實際)值M - N這樣M>N最小化double。這M將是我想查找的向上舍入轉換。

我可以逃脫適當設置FP環境的舍入模式和執行一個簡單的鑄件(如(double) N)?

澄清:您可以假設該平臺支持IEEE標準的浮點運算(IEEE 754)。

+0

當然FP硬件會比任何位操作速度更快。您是否在尋找軟件解決方案? – chux 2014-11-25 02:57:26

+0

順便說一句,你不是指'(雙)N)'? – chux 2014-11-25 03:00:53

+0

你的問題是特定於平臺的,但你提出的解決方案正是我如何去做這個任務。 – tmyklebu 2014-11-25 03:31:34

回答

2

我能否適當設置FP環境的舍入模式並執行簡單的強制轉換(例如(雙)N)?

是的,只要編譯器實現了IEEE 754(其中大部分至少粗略地)。從一種浮點格式轉換到另一種浮點格式是根據IEEE 754應採用舍入模式的操作之一。要將long double轉換爲double,請將舍入模式設置爲向上並進行轉換。

在C99,它應該由C++編譯器可以接受的(我不知道一個語法是C++指定):

#include <fenv.h> 
#pragma STDC FENV_ACCESS ON 
… 
fesetround(FE_UPWARD); 
double d = (double) ld; 

PS:你可能會發現你的編譯器不實現#pragma STDC FENV_ACCESS ON正常。歡迎來到club