C++中long double字面量的后缀是什么?

87
在C++(和C)中,没有后缀的浮点字面量默认为 double 类型,而后缀 f 表示 float 类型。那么如何使用后缀来表示 long double 呢?
不知道的话,可以定义如下:
const long double x = 3.14159265358979323846264338328;

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


2
只需预处理此文件#include <float.h> LDBL_MAX,您就会看到1.18973149535723176502e+4932L,这是对您问题的回答。 - Marc Glisse
关于“这种担忧是否有理”,答案取决于具体情况。你的PI值精度为1e-28。双精度浮点数的机器epsilon值约为2.22e-16,因此它比你需要的值要小,无法准确捕捉到这个数字。这重要吗?这取决于你的计算是否需要那么精确... - IdeaHat
@EricPostpischil,这显然展示了如何拼写出一个 long double 常量...(后缀 L) - Marc Glisse
4个回答

97

根据C++标准:

浮点字面量的类型是double,除非使用后缀显式指定。后缀f和F表示float类型,后缀l和L表示long double类型。

有趣的是,将其与C标准的相应段落进行比较。在C中,使用术语 floating constant 而不是 floating literal :

  

未指定后缀的浮点常量具有double类型。 如果以字母f或F作为后缀,则具有float类型。 如果以字母l或L作为后缀,则具有long double类型。


28

C语言的后缀是L。我强烈怀疑C++也是这样。

你的担忧是有道理的。你的文字量首先会被转化为一个double,因此会被截断,然后再转化回long double


13

你的关注是有道理的,你应该使用 L 后缀表示 long double 字面量。


4
"F"来自哪里?我查了一下C标准,只有“L”。 - Jens Gustedt

2
我尝试了“l”后缀:

我尝试了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

1
在许多实现中,doublelong double 的表示(因此值范围、精度等)是相同的(例如 64 位 IEEE 浮点数)。就像在许多实现中,longlong long 的表示也是相同的(例如 64 位 2 补码有符号整数)。但在这两种情况下,它们仍然被类型系统视为不同。例如,使用 1.01.0L 调用函数模板将推断出不同的类型并调用模板的不同特化版本。1L1LL 也是如此。 - Paul Groke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接