Полная точность отображения чисел с плавающей точкой в ​​C ++?

Я прочитал несколько тем об отображении чисел с плавающей запятой в C ++ и не смог найти удовлетворительного ответа.

Мой вопрос: Как отобразить все значащие цифры чисел с плавающей запятой в C ++ в научном формате (мантисса / экспонента)?

Проблема в том, что все числа не имеют одинакового количества значащих цифр в базе 10.

Например, double имеет С 15 до 17 точность значащих десятичных цифр, но std::numeric_limits<double>::digits10 возвращает 15 и, следовательно, для некоторых чисел я потеряю 2 дополнительные десятичные цифры точности.

2

Решение

Значение std::numeric_limits<double>::digits10 предоставляет количество десятичных цифр, которые можно безопасно восстановить, т. е. количество десятичных цифр, которые выживают при прохождении в обоих направлениях->double-> десятичное. Предполагать, что больше десятичных цифр правильно, не полезно. Если вы хотите организовать поездку туда и обратно double-> decimal->double вы бы использовали std::numeric_limits<double>::max_digits10,

Если вы хотите, чтобы точные значения вы использовали std::numeric_limits<double>::digits но он будет отображать числа, преобразованные из десятичных значений в забавной форме, поскольку они обычно являются округленными значениями. Это также причина, почему max_digits10 бесполезно при представлении цифр для потребления человеком: последние несколько цифр обычно не соответствуют ожиданиям читателя.

5

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

Вы смотрели на std::max_digits10?

От cppreference:

Значение std::numeric_limits<T>::max_digits10 это число
цифры от 10 до 10, которые необходимы для уникального представления всех
значения типа Tтакие как необходимые для
сериализация / десериализация в текст. Эта константа имеет значение для
все типы с плавающей точкой.

Смысл этого (и как я его использую) заключается в том, что вывод текста может быть скопирован / вставлен в другую программу, и число будет представлять такое же количество.

Теперь я должен сказать, что мой формат рабочей лошади всегда оправдан %23.16E, и я использую инженерное суждение для последних нескольких цифр. Мне это нравится, потому что достаточно для знака, экспоненты и шестнадцати цифр.

-----------------------
-1.1234567812345678E+12

Теперь обратите внимание, что digits точности и decimal digits точности не обязательно одно и то же.

2

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