Использование длинного двойного

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

#include <iostream>
using namespace std;

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

person Community    schedule 18.07.2015    source источник
comment
Вы сохраняете полное значение с плавающей запятой, которое вы просто не печатаете. Попробуйте cout << std::setprecision(30) << pi << '\n';   -  person Galik    schedule 18.07.2015


Ответы (3)


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

#include <iostream>
#include <iomanip>

int main()
{

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

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


}
person Russell Greene    schedule 18.07.2015
comment
Что, если я хочу умножить два из этих чисел с точностью до 20? - person ; 18.07.2015
comment
std::setprecision НИКОГДА не влияет на внутренние данные. все, что он делает, это устанавливает, сколько цифр печатается. Вы можете легко умножить другое long double на pi, а затем распечатать его, пока вы используете std::setprecision - person Russell Greene; 18.07.2015
comment
когда я пытаюсь запустить этот оператор if 'if(i%k!=0&&j%k!=0)', он говорит, что недопустимые операнды типов 'long double' и 'long double' для двоичного 'operator%' - person ; 18.07.2015
comment
Да, изменить можно только (en.wikipedia.org/wiki/Modulo_operation) целое число операнды. Что ты пытаешься сделать? - person Russell Greene; 18.07.2015
comment
Я пытаюсь проверить простые кратные числа, которые не могут быть сохранены в 4-байтовом int - person ; 18.07.2015
comment
попробуйте использовать uint64_t, определенный в `‹cstdint›. это 64-битное целое число без знака, хранящее значения до 2^64. Это достаточно большой? - person Russell Greene; 18.07.2015

Проблема в том, что даже 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
person Shreevardhan    schedule 18.07.2015

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

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

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

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

person Raman    schedule 18.07.2015