2015-07-18 7 views
1

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

#include <iostream> 
using namespace std; 

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

Вы сохраняете полную стоимость с плавающей точкой вы просто не печать все это. Попробуйте 'cout << std :: setprecision (30) << pi << '\ n';' – Galik

ответ

2

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

#include <iostream> 
#include <iomanip> 

int main() 
{ 

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

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


} 
+0

Что делать, если я хочу умножить два из этих чисел с точностью 20 – Mat

+2

Внутренние данные НИКОГДА не зависят от 'std :: setprecision '. все, что он делает, устанавливается, сколько цифр печатается. Вы можете легко выполнить несколько «long double» на 'pi', а затем распечатать его, так что вы используете' std :: setprecision' –

+0

, когда я пытаюсь запустить этот оператор if: \t if (i% k! = 0 && j% k! = 0) 'он говорит \t недопустимые операнды типов long double' и 'long double' to binary 'operator%' – Mat

1

Там нет никаких проблем (а на самом деле есть проблема с точностью) при хранении значение в долгосрочной двойной. Проблема заключается в его печати.

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

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

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

1

Проблема здесь 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