我目前正在進行數值計算的C++項目。絕大多數的代碼都使用單精度浮點值,並且完全適用於此。正因爲如此,我使用編譯器標誌來設置基本浮點文字單精度而不是雙精度,這是默認值。我發現這使得表達式更易於閱讀,我不必擔心在某處忘記了'f'。然而,我偶爾需要雙精度計算提供的額外精度,而我的問題是如何將雙精度文字轉換爲這種表達式。我迄今試過的每種方法都是先將值存儲在單個精度變量中,然後將截斷值轉換爲雙精度值。不是我想要的。在C++中是否有一個浮點數字後綴來進行數字雙精度?
我已經嘗試過的一些方法到目前爲止在下面給出。
#include <iostream>
int main()
{
std::cout << sizeof(1.0E200) << std::endl;
std::cout << 1.0E200 << std::endl;
std::cout << sizeof(1.0E200L) << std::endl;
std::cout << 1.0E200L << std::endl;
std::cout << sizeof(double(1.0E200)) << std::endl;
std::cout << double(1.0E200) << std::endl;
std::cout << sizeof(static_cast<double>(1.0E200)) << std::endl;
std::cout << static_cast<double>(1.0E200) << std::endl;
return 0;
}
使用單精度常數運行會得出以下結果。
~/path$ g++ test.cpp -fsingle-precision-constant && ./a.out
test.cpp:6:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:7:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:12:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:13:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:15:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
test.cpp:16:3: warning: floating constant exceeds range of ‘float’ [-Woverflow]
4
inf
16
1e+200
8
inf
8
inf
這是我的理解是,後兩種情況下提供的8個字節應該足以容納1.0E200,通過下面的輸出,其中相同的程序,而不-fsingle精恆編譯支持的理論。
~/path$ g++ test.cpp && ./a.out
8
1e+200
16
1e+200
8
1e+200
8
1e+200
可能的解決方法由上述實施例建議的是使用四倍精度浮點文字到處我原本需要時通過庫和這種使用雙精度,並澆鑄成雙精度。但是,這感覺有點浪費。
我還能做什麼?
未經審訊,但'的strtod (「1e + 200」)可能會被優化爲您希望的雙精度浮點常量。 –
我不知道,這聽起來有點像你正在爲自己創造一個問題。爲什麼不把它保留原樣並將'f'附加到不需要雙精度的所有內容? – Mysticial
你可以把你的雙常量放在一個單獨的文件中,並且不用'-fsingle-precision-constant'標誌來編譯它。 –