在 C++(和 C)中,没有后缀的浮点文字默认为
double
,而后缀 f
则意味着 float
。但是获得 long double
的后缀是什么?
在不知道的情况下,我会定义,说,
const long double x = 3.14159265358979323846264338328;
但我担心的是变量
x
包含的 3.14159265358979323846264338328
有效位少于 64,因为这是一个 double
文字。这种担心有道理吗?
来自 C++ 标准
除非明确指定,否则浮动文字的类型为 double 通过后缀。后缀 f 和 F 指定 float,后缀 l 和 L 指定长双精度。
与 C 标准的相应段落进行比较很有趣。在 C 中,使用术语
floating constant
而不是 C++ 中的 floating literal
:
4 无后缀浮点常量的类型为 double。如果后缀为字母 f 或 F,则其类型为 float。如果后缀为字母 l 或 L,则其类型为 long double
C 后缀是
L
。我强烈怀疑 C++ 也是如此。
您的担心是有道理的。您的文字首先会被转换为
double
,从而被截断,然后再转换回 long double
。
您的担忧是有效的,您应该使用
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
我认为 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