Для почти всех применений, встроенных типов плавающих точек,двойной
(идлинныйдвойной).
, если это обеспечивает более высокую точность, чем, двойная
, обеспечивает достаточную точность, как правило, дюжина десятичных знаков.
Некоторые причины, по которым вы хотите использовать более высокую точность:
- Гораздо более точный результат (многие цифры) является просто требованием.
- Диапазон вычисленного значения превышает диапазон типа: факториалы — пример учебника.
двойной
является (или может быть) слишком неточной.
[или может быть] слишком неточно.
- Использование типа расширенной точности, реализованного в программном обеспечении какдвойнойДарвин, иногда непредсказуемо неточно.
- Потеря точности или неточности, вызванная крайними аргументами или ошибкой отмены.
- Требуется максимальная точность для выбранного типа плавающей точки.
- В качестве эталонного значения, например, для определения неточности значения, вычисляемого со встроенным типом с плавающей точкой (возможно, даже с использованием какого-то быстрого «грязного» алгоритма). Точность многих функций и распределений в Boost. Математика была измерена таким образом из таблиц с очень высокой точностью (до 1000 десятичных знаков).
Многие функции и распределения имеют отличия от точных значений, которые представляют собой лишь несколько наименее значимых битов — шума вычислений. Другие, часто те, для которых аналитические решения недоступны, требуют приближений и итерации: они могут потерять несколько десятичных цифр точности.
Гораздо большая потеря точности может произойти дляпограничныхилиугловых случаев, часто вызванныхошибками отмены.
(Некоторые из наихудших и наиболее распространенных примеровошибки отмены или потери значимостиможно избежать, используядополнения: см.Почему дополнения?.
Если вам требуется значение, которое является столь же точным, как может быть представлено в типе с плавающей точкой, и, таким образом, является самым близким представляемым значением и имеет погрешность менее 1/2 aнаименее значимый битилиulp, может быть полезно использовать тип с более высокой точностью, например,cpp_dec_float_50
, для генерации этого значения. Преобразование этого значения во встроенный тип с плавающей запятой ('плавающий',двойной
илидлинныйдвойной
) не приведет к дальнейшей потере точности. Десятичная строка также будет «читаться» точно компилятором во встроенный тип с плавающей точкой до ближайшего репрезентабельного значения.
![[Note]](/img/note.png) |
Note |
В отличие от этого, чтение значения изstd:istream во встроенный тип с плавающей точкойне гарантируется C++ Стандартдля получения ближайшего репрезентативного значения. |
Уильям Кахан ввел терминДилемма Таблицыдля проблемы правильного округления функций. Использование гораздо более высокой точности (50 или 100 десятичных знаков) является практическим способом генерации (почти всегда) правильно округленных значений.