Я прочитал несколько тем об отображении чисел с плавающей запятой в C++ и не нашел удовлетворительного ответа.
Мой вопрос: как отобразить все значащие цифры чисел с плавающей запятой в C++ в научном формате (мантисса/экспонента)?
Проблема в том, что все числа имеют разное количество значащих цифр по основанию 10.
Например, double
имеет точность от от 15 до 17 значащих десятичных цифр, но std::numeric_limits<double>::digits10
возвращает 15, и, следовательно, для некоторых чисел я потеряю 2 дополнительные десятичные цифры точности.
precision(std::numeric_limits<double>::digits10 + 2)
? Конечно, если последние две цифры являются случайным мусором, сгенерированным в результате ваших вычислений (например,1.00000000000005 + 100 - 100
[при условии, что компилятор не удалил +100 - 100 как бессмысленные, например, потому что это неизвестные в то время переменные]). Следует отметить, что, например, printf glibc выдаст мусор, если вы напечатаете что-то вродеdouble value = 1.234E+300
какprintf("%f", value);
— будет около 280 цифр «случайности») - person Mats Petersson   schedule 26.10.2013cout
делает в этом случае. - person Mats Petersson   schedule 27.10.2013digits10
. Это те цифры, которые могут не сохраниться при обратном преобразовании из десятичного числа в число с плавающей запятой, и это только те цифры, на которые влияет наименьшее возможное округление в числах с плавающей запятой. Когда кто-то выполняет более одного вычисления, ошибки могут складываться различными способами, приводя к совокупной ошибке, которая может варьироваться от нуля до бесконечности, в зависимости от обстоятельств. - person Eric Postpischil   schedule 27.10.2013digits10
. Поэтому у вас должно быть больше цифр. - person Eric Postpischil   schedule 27.10.2013