什么是长双重文字的C ++后缀?

时间:2014-02-04 16:23:24

标签: c++ c literals floating-point-precision

在C ++(和C)中,没有后缀的浮点文字默认为double,而后缀f则隐含float。但获得long double的后缀是什么?

不知道,我会定义,比方说,

const long double x = 3.14159265358979323846264338328;

但我担心变量x包含的3.14159265358979323846264338328的有效位数少于64,因为这是double字面值。这种担心是否合理?

4 个答案:

答案 0 :(得分:56)

来自C ++标准

  

除非明确指定,否则浮动文字的类型为double   用后缀。后缀f和F指定float,后缀为l和L.   指定long double。

与C标准的相应段落进行比较很有意思。在C语言中,C ++中使用了术语floating constant而不是floating literal

  

4未加浮动的常量类型为double。如果以字母f或F为后缀,则表示类型为float。如果以字母l或L为后缀,则其类型为long double

答案 1 :(得分:18)

C后缀为L。我强烈怀疑C ++是一样的。

你的担心是合理的。您的文字将首先转换为double,然后被截断,然后转换回long double

答案 2 :(得分:10)

您的担忧是有效的,您应该使用L后缀来表示长双字。

答案 3 :(得分:0)

我尝试了 l 后缀:

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

int main()
{
  float t1 = 1.10000000000000000002l;
  double t2 = 1.10000000000000000002l;
  long double t3 = 1.10000000000000000002L;
  cout << setprecision(25);
  cout << t1 << endl;
  cout << t2 << endl;
  cout << t3 << endl;
}

我仍然得到这个输出,表明缺乏所需的精度:

1.10000002384185791015625
1.100000000000000088817842
1.100000000000000088817842