Как запретить вывод острингстрим (или аналогичный) научной нотации без установки точности - PullRequest
4 голосов
/ 19 марта 2012

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

Я прочитал бесчисленные примеры того, как этого добиться, используя "setprecision (...)" и "fixed" и т. Д., Но проблема в том, что точность чисел не известна во время компиляции и ввода консервативной оценки с помощью 'setprecision (...)' оставляет кучу лишних нулей в этом месте.

Вот пример того, что я ищу:

let: tau = 6.2831

tau * 0.000001 -> 0.0000062831
tau * 0.001    -> 0.0062831
tau            -> 6.2831
tau * 1000     -> 6283.1
tau * 1000000  -> 6283100

На данный момент получаю:

tau * 0.000001 -> 6.2831e-006
tau * 0.001    -> 0.0062831
tau            -> 6.2831
tau * 1000     -> 6283.1
tau * 1000000  -> 6.2831e+006

Единственное, что я могу сделать, это как-то извлечь показатель степени двойного, тогда, если показатель положителен, «установить» точность на ноль, в противном случае установить точность на «-1 * exp»; но это кажется чрезвычайно запутанным способом «выключения» научной нотации. Кто-нибудь знает лучший способ?

1 Ответ

1 голос
/ 19 марта 2012

Хотя большинство десятичных дробей не могут быть представлены точно двоичным числом FP, а представление точно двоичного числа FP может привести к большому количеству цифр, существуют алгоритмы для форматирования двоичной FP как простейшего десятичного числа, которое будет прочитанообратно в качестве исходного FP, предполагая, что заданный режим маршрутизации на входе (т. е. 6.283100128173828125 будет отформатирован как 6.2831, но следующий представимый номер FP будет отформатирован с 6 или 7 цифрами).

К сожалению, форматированный ввод-вывод в C ++ (и в C) нет возможности попросить применить эти алгоритмы.%g printf и значение по умолчанию IOStream является ближайшим доступным, но они в сочетании с автоматическим выбором между фиксированной и научной нотацией, им нужна максимальная точность и исключение окончания 0 не совсем то же самое (они действуют на точное десятичное представление, они не пытаются найти самое простое).

Обратите внимание, что эти алгоритмы на самом деле не просты, они нуждаются в многоточной арифметике.

...