What's the C++ suffix for long double literals?
C++CLiteralsFloating Point-PrecisionC++ Problem Overview
In C++ (and C), a floating point literal without suffix defaults to double
, while the suffix f
implies a float
. But what is the suffix to get a long double
?
Without knowing, I would define, say,
const long double x = 3.14159265358979323846264338328;
But my worry is that the variable x
contains fewer significant bits of 3.14159265358979323846264338328
than 64, because this is a double
literal. Is this worry justified?
C++ Solutions
Solution 1 - C++
From the C++ Standard
> The type of a floating literal is double unless explicitly specified > by a suffix. The suffixes f and F specify float, the suffixes l and L > specify long double.
It is interesting to compare with corresponding paragraph of the C Standard. In C there is used term floating constant
instead of floating literal
in C++:
> 4 An unsuffixed floating constant has type double. If suffixed by the letter f or F, it has type float. If suffixed by the letter l or L, it has type long double
Solution 2 - C++
The C suffix is L
. I'd strongly suspect that it is the same for C++.
Your worry is justified. Your literal would first be converted to a double
, and thus truncated, and then converted back to long double
.
Solution 3 - C++
Your concern is valid and you should use a L
suffix for long double literal.
Solution 4 - C++
I tried the l
suffix:
#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;
}
Still I get this output indicating the lack of desired precision:
1.10000002384185791015625
1.100000000000000088817842
1.100000000000000088817842