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

问题描述 投票:0回答:5

在 C++(和 C)中,没有后缀的浮点文字默认为

double
,而后缀
f
则意味着
float
。但是获得
long double
的后缀是什么?

在不知道的情况下,我会定义,说,

const long double x = 3.14159265358979323846264338328;

但我担心的是变量

x
包含的
3.14159265358979323846264338328
有效位少于 64,因为这是一个
double
文字。这种担心有道理吗?

c++ c literals floating-point-precision
5个回答
102
投票

来自 C++ 标准

除非明确指定,否则浮动文字的类型为 double 通过后缀。后缀 f 和 F 指定 float,后缀 l 和 L 指定长双精度。

与 C 标准的相应段落进行比较很有趣。在 C 中,使用术语

floating constant
而不是 C++ 中的
floating literal

4 无后缀浮点常量的类型为 double。如果后缀为字母 f 或 F,则其类型为 float。如果后缀为字母 l 或 L,则其类型为 long double


28
投票

C 后缀是

L
。我强烈怀疑 C++ 也是如此。

您的担心是有道理的。您的文字首先会被转换为

double
,从而被截断,然后再转换回
long double


13
投票

您的担忧是有效的,您应该使用

L
后缀来表示长双精度文字。


2
投票

我尝试了

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

0
投票

我认为 25 精度太多了,根据这个 long double 有 18

#include <iostream>     // std::cout
#include <limits>       // std::numeric_limits

int main(){
    std::cout << std::numeric_limits<long double>::digits10 << std::endl;
    std::cout << std::numeric_limits<double>::digits10 << std::endl;
    std::cout << std::numeric_limits<float>::digits10 << std::endl;
}

输出:

18
15
6
© www.soinside.com 2019 - 2024. All rights reserved.