Я прочитал несколько тем об отображении чисел с плавающей запятой в C ++ и не смог найти удовлетворительного ответа.
Мой вопрос: Как отобразить все значащие цифры чисел с плавающей запятой в C ++ в научном формате (мантисса / экспонента)?
Проблема в том, что все числа не имеют одинакового количества значащих цифр в базе 10.
Например, double
имеет С 15 до 17 точность значащих десятичных цифр, но std::numeric_limits<double>::digits10
возвращает 15 и, следовательно, для некоторых чисел я потеряю 2 дополнительные десятичные цифры точности.
Значение std::numeric_limits<double>::digits10
предоставляет количество десятичных цифр, которые можно безопасно восстановить, т. е. количество десятичных цифр, которые выживают при прохождении в обоих направлениях->double
-> десятичное. Предполагать, что больше десятичных цифр правильно, не полезно. Если вы хотите организовать поездку туда и обратно double
-> decimal->double
вы бы использовали std::numeric_limits<double>::max_digits10
,
Если вы хотите, чтобы точные значения вы использовали std::numeric_limits<double>::digits
но он будет отображать числа, преобразованные из десятичных значений в забавной форме, поскольку они обычно являются округленными значениями. Это также причина, почему max_digits10
бесполезно при представлении цифр для потребления человеком: последние несколько цифр обычно не соответствуют ожиданиям читателя.
Вы смотрели на std::max_digits10
?
От cppreference:
Значение
std::numeric_limits<T>::max_digits10
это число
цифры от 10 до 10, которые необходимы для уникального представления всех
значения типаT
такие как необходимые для
сериализация / десериализация в текст. Эта константа имеет значение для
все типы с плавающей точкой.
Смысл этого (и как я его использую) заключается в том, что вывод текста может быть скопирован / вставлен в другую программу, и число будет представлять такое же количество.
Теперь я должен сказать, что мой формат рабочей лошади всегда оправдан %23.16E
, и я использую инженерное суждение для последних нескольких цифр. Мне это нравится, потому что достаточно для знака, экспоненты и шестнадцати цифр.
-----------------------
-1.1234567812345678E+12
Теперь обратите внимание, что digits
точности и decimal digits
точности не обязательно одно и то же.