Используя длинный двойной

Ниже приведена моя программа на C ++. Я хочу сохранить длинное число, например, пи, в переменной, поэтому я пытаюсь использовать long double. Но когда я запускаю программу, она отображает только 3.14159. Как сохранить полное число с плавающей точкой в ​​переменной?

#include <iostream>
using namespace std;

int main() {
long double pi;
pi = 3.14159265358979323846264338327950288419716939937510;
cout << "PI = " << pi << endl;
return 0;
}

1

Решение

Используя потоковые манипуляторы, это легко:

#include <iostream>
#include <iomanip>

int main()
{

long double pi;
pi = 3.14159265358979323846264338327950288419716939937510L; // L for long double literal

std::cout << "PI: " << std::setprecision(20) << pi;}
2

Другие решения

Проблема здесь даже long double имеет ограниченную точность. Учти это (C++11)

#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>
using namespace std;

int main() {
cout.precision(51);
std::string pi("3.14159265358979323846264338327950288419716939937510");
cout << pi << endl;
cout << stold(pi) << endl;
cout << M_PIl << endl;        /// The constant from <math.h>
}

Выход

3.14159265358979323846264338327950288419716939937510
3.14159265358979323851280895940618620443274267017841
^ value changes from here (18th decimal place)
3.14159265358979323851280895940618620443274267017841
2

Нет никакой проблемы (ну, на самом деле, есть проблема с точностью) в сохранении значения в long double. Проблема с печатью.

Попробуйте это вместо этого:

cout << "PI = " << setprecision(40) << pi << endl;

Если вы попробуете вышеизложенное, вы обнаружите, что значение, действительно напечатанное, запустится потерять точность после некоторых десятичных знаков (я думаю, 18-25). Точность long double в c / c ++ равна реализация определена. Таким образом, вы должны проверить свою систему на максимальную точность, которую может хранить длинный двойной.

1
По вопросам рекламы [email protected]