MPFR C++ Печать чисел с плавающей запятой, таких как целые числа

Только что успешно скомпилировав программу с использованием MPFR C++ (первый раз), мне нужно распечатать несколько довольно больших чисел, но они получаются только в виде инженерных обозначений, а не целых чисел. Из того, что я прочитал, библиотека не оптимизирована для (произвольных) целых чисел, поэтому можно использовать числа с плавающей запятой как целые числа, поскольку в них не будет десятичных знаков. Я только новичок в C ++, поэтому я не знаю, как пройти через все доступные инструменты, но есть ли способ распечатать (большие) числа с плавающей запятой, как если бы они были целыми числами? Например, вместо (скажем) 1.12276e+44 напечатайте 112275575285571389562324404930670903477890625. Если я попробую std::cout.precision(44), я получу 1.12275575285571389562324404930670903477890625e+44, что выглядит ничуть не лучше.


person a concerned citizen    schedule 16.09.2016    source источник
comment
Пробовали ли вы использовать любой из других форматов вывода с плавающей запятой?   -  person Some programmer dude    schedule 16.09.2016
comment
Что произойдет, если вы добавите std::fixed? источник: en.cppreference.com/w/cpp/io/manip/fixed< /а>   -  person Richard Critten    schedule 16.09.2016
comment
@JoachimPileborg Нет, не видел. Спасибо, что разместили ссылку. std::fixed, похоже, приближается к тому, что я хочу, а не к печати десятичных знаков. Это единственный способ сделать это?   -  person a concerned citizen    schedule 16.09.2016
comment
Вы всегда можете свернуть свой собственный отпечаток. Обратите внимание, что примерно после 9 цифр для числа с плавающей запятой и 18 цифр для двойного числа вы не печатаете точные (значащие могут быть лучше) значения из-за присущей точности вышеуказанных типов данных.   -  person Richard Critten    schedule 16.09.2016
comment
@RichardCritten Я использую MPFR C++, разве это не должно дать мне необходимую точность?   -  person a concerned citizen    schedule 16.09.2016
comment
Извините пропустил это   -  person Richard Critten    schedule 16.09.2016


Ответы (1)


MPFR C++ позволяет точно настроить формат вывода в стиле printf (если стандартных возможностей C++ недостаточно). Пример:

std::cout<<x.toString("%34.0RNf")

Пожалуйста, обратитесь к руководству MPFR для спецификации формата в скобках. Также вы можете проверить этот вопрос: https://stackoverflow.com/a/9627660/479995

person Pavel Holoborodko    schedule 16.09.2016
comment
Спасибо за ответ. Я не думаю, что есть способ работать с большими целыми числами, а не с плавающей запятой? Мне нужно генерировать полиномы, и порядок может достигать 50, но я все еще думаю, следует ли мне ограничить его или позволить пользователям повеселиться... - person a concerned citizen; 16.09.2016
comment
На самом деле MPFR не является библиотекой для больших целых чисел, и не стоит имитировать их с помощью типов с плавающей запятой. GMP/MPIR специально ориентированы на это (см. тип mpz_t), для библиотек существуют некоторые оболочки C++. - person Pavel Holoborodko; 16.09.2016
comment
Тип с плавающей запятой имеет фиксированное количество битов для хранения числа, поэтому действительно большое целое число будет округлено до этого количества бит. Встроенная библиотека big-int увеличивает числовую память для точного хранения чисел. - person Pavel Holoborodko; 16.09.2016
comment
Первым был предложен GMP, но в нем не было даже sin/cos, затем был предложен MPFR, но он был слишком неуклюжим и запутанным, пока я не увидел обертки. Дело в том, что мне также нужно выяснить корни этих многочленов, поэтому, если я найду способ использовать настоящие целые числа, я думаю, что следующей стеной, которую я увижу, будет то, как использовать целое число в качестве аргумента с плавающей запятой в корне. функция нахождения. Использование чисел с плавающей запятой вместо целых, кажется, уже вызывает у меня головную боль, поскольку я вижу десятичные дроби там, где их быть не должно, но это может быть моя генерация полиномов. - person a concerned citizen; 16.09.2016