Как правильно напечатать до 100-й десятичной точки переменную типа float или double?

Предположим, что есть два номера 22 и 7. Я хочу напечатать до 100-го десятичного знака ответа, который должен выглядеть как 3.1428571428571428571428571 .... тогда как попытка использовать

cout << setprecision(100) << fixed << (22.0/7.0); 

Я получаю что-то вроде 3.142857142857142793701541449991054832935333251953125 .......

c++,floating-point,double,floating-accuracy,

1

Ответов: 3


1

обычно в c ++, int main () { const long double pi = 22.0 / 7.0 ; std :: cout << std :: setprecision ( std :: numeric_limits < long double > :: max ()) << pi << ' n' ; } (большее из двух) хранится в 8 байтах. это означает, что число может содержать 2 ^ 8 * 8 = 2 ^ 64 байтов (^ = мощность). это означает, что наибольшее количество цифр после точки, после сохранения знака и местоположения с плавающей точкой, составило бы не более 15 цифр. поэтому вам придется создавать другие средства, тогда int main () { const long double pi = 22.0 / 7.0 ; std :: cout << std :: setprecision ( std :: numeric_limits < long double > :: digitits ) << pi << ' n' ; } для этого вычисления. вот моя ссылка: https://www.tutorialspoint.com/cplusplus/cpp_data_types.htm


0

Когда я пытаюсь

cout << setprecision(100) << fixed << (22.0/7.0);

OP's reported result
3.142857142857142793701541449991054832935333251953125.......
// My expected result of the double 22.0/7.0
3.1428571428571427937015414499910548329353332519531250000000....

Я получаю утечку сегментации.

Максимум, который вы получаете:

double

выход: 3.142857142857142793701541449991054832935333251953125


0

Печать не является проблемой. Код хорошо печатает двойственность в виде двойного n, d, q; ,

n/d

Использование doubleматематики, в общем, не обеспечит ОП с точностью до 100 цифр. Вот почему.

Разный подход к объяснению

doubleОбычно A 64 бит. Это дает до 2 64 комбинаций точно представляемых чисел. Рассмотрите n,dи разделите q. Это 2 128 различных комбинаций, doubleно мы пытаемся привести все эти результаты q. Многие вызовут тот же ответ (22.0 / 11.0 и 14.0 / 7.0 оба сделают 2.0). Тем не менее, существует, конечно, более 2 64 различных математических ответа.

Таким образом, C округляет ответ к лучшему - обычно ближайший - представимый double .

В этом случае: 22.0 / 7.0, точно, не в одной из этих двух 64 комбинаций.
«Лучшее» - «что-то вроде 3.142857 142857 142793 7015414 ...»

double x = 22.0/7.0;
//  x   3.142857 142857 142793 701...

// 22.0/7.0
// math 3.142857 142857 142857 142857 

double next_x = nextafter(22.0/7.0, 4.0);
//      3.142857 142857 143237 790...
C ++ с плавающей точкой, двойной, с плавающей точностью,
Похожие вопросы