我目前正在其上做数值计算一个C ++项目。 在广阔,绝大部分代码使用单精度浮点值和作品与完美的罚款。 正因为如此我使用编译器标志,使单精度而非双精度,这是默认的基本浮点文字。 我觉得这让表情更容易阅读,我不必担心忘记一个“F”的地方。 然而,每一个现在,那么我就需要用双精度计算提供了额外的精度和我的问题是怎样才能得到一个双精度字面到这样的表达。 每次这样,我已经试过迄今为止第一个值存储在单精度变量和截断值转换为双精度值。 不是我想要的。
到目前为止,我已经尝试了一些方法如下。
#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;
}
与单精度常数A运行给出以下结果。
~/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
通过上述实施例建议的一种可能的解决方法是使用四倍精度浮点文字到处我原本需要时通过库和这种使用双精度,并浇铸成双精度。 然而,这种感觉有点浪费。
我还可以做些什么?