What's the C++ suffix for long double literals?

C++CLiteralsFloating Point-Precision

C++ 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionWalterView Question on Stackoverflow
Solution 1 - C++Vlad from MoscowView Answer on Stackoverflow
Solution 2 - C++Jens GustedtView Answer on Stackoverflow
Solution 3 - C++Ivaylo StrandjevView Answer on Stackoverflow
Solution 4 - C++DKSView Answer on Stackoverflow