有没有C ++中的浮点字面后缀做了一些双精度?(Is there a floating point

2019-06-27 14:55发布

我目前正在其上做数值计算一个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

通过上述实施例建议的一种可能的解决方法是使用四倍精度浮点文字到处我原本需要时通过库和这种使用双精度,并浇铸成双精度。 然而,这种感觉有点浪费。

我还可以做些什么?

Answer 1:

像马克说,标准的表示,其双除非它后跟一个f。

有标准和使用编译器标志背后理由绕过它为了方便是不好的做法。

所以,正确的做法是:

  1. 删除编译器标志
  2. 在浮点变量存储双值时,修正有关的精度损失所有的警告(在所有的F后缀添加)
  3. 当你需要加倍,省略后缀f。

它可能不是回答你要找的,但它是如果你关心你的代码库的寿命,你应该使用的方法。



Answer 2:

如果你读2.13.3 / 1,你会看到:

除非后缀明确指定类型的浮动文字的两倍。 后缀F和F指定浮子,后缀L和L指定长一倍。

换句话说,没有后缀指定double ,如果你更改默认为文字浮点常量float 。 不幸的是,你不能在这种情况下,两全其美。



Answer 3:

如果你能负担得起GCC 4.7或3.1铛,使用用户定义的文字:

double operator "" _d(long double v) { return v; }

用法:

std::cout << sizeof(1.0E200_d) << std::endl;
std::cout << 1.0E200_d << std::endl;

结果:

8
1e+200


Answer 4:

你不能定义自己的后缀,但也许像宏

#define D(x) (double(x##L))

会为你工作。 编译器应该只是发出一个双常数,似乎与-O2我的系统上。



文章来源: Is there a floating point literal suffix in C++ to make a number double precision?