Определение десятичной точности числа с плавающей запятой - PullRequest
0 голосов
/ 05 июля 2018

Я искал в Интернете уже несколько дней и, похоже, не могу найти общепринятую формулу для определения количества десятичных цифр, которые мы можем сохранить в формате с плавающей запятой без ошибки усечения. Наиболее часто встречающийся ответ:

Десятичная точность = log₁₀ (2ⁿ), где n = количество битов в мантиссе.

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

Однако, когда я пошел проверить это по примерам в моей книге по CS, цифры не совпадали.

В примерах использовался 8-битный формат с 4-битной мантиссой. Учитывая приведенную выше формулу, я смогу хранить только десятичное значение с точностью до 1,2 цифры. Тем не менее, в соответствии с книгой (и подтверждается попытками других десятичных значений) я могу сохранить значение, такое как 2,25, в 4-битной мантиссе без усечения. 0.0625 также может быть сохранено без ошибок. В обоих этих случаях десятичные цифры превышают 1,2, указанные в приведенном выше уравнении.

Я не могу не задаться вопросом, есть ли что-то, что я пропускаю. Есть ли способ определить десятичную точность с учетом мантиссы любого размера? Конфликтует ли приведенная выше формула с полями мантиссы ниже определенного размера?

Любая ясность по этому вопросу будет принята с благодарностью.

Дэнни Д.

1 Ответ

0 голосов
/ 13 июля 2018

общепринятая формула для определения количества десятичных цифр, которое мы можем сохранить в формате с плавающей запятой без ошибки усечения.

Исследования FLT_DIG, DBL_DIG, LDBL_DIG. Это количество значащих десятичных цифр (как в текст ), которые можно округлить до типа с плавающей запятой и обратно для float, double, long double.

С двоичными базами и для обобщения для OP используйте

floor((significant_bits - 1) log10(base))

С base == 2 и символом significant_bits == 5 бит (4 явно кодированных, 1 подразумевается), это floor(1.204...) или 1.

Это означает с десятичными числами вида w.000 * 10 power , all комбинации w (1 - 9) и power ( в минимальном / максимальном диапазоне) будет "круговая передача" от десятичного текста до OP_s_Floating_point_type до десятичного текста успешно.

Если попытаться выполнить обратный десятичный текст вида w.y00 * 10 power , для некоторой комбинации w,y произойдет сбой. Это не означает, что все комбинации этой формы потерпят неудачу, только некоторые.

Попробуйте взять десятичный текст "9.0", "9.1", "9.2", ... "9.9" и преобразовать эти 10 в формат FP OP. В диапазоне 9 этот формат поддерживает только кодирование 9.0 и 9.5. Таким образом, сопоставление этих 10 чисел приведет к 2 разным числам FP. Конечно, преобразование этих 2 обратно в десятичную форму дает только 2 разных ответа. Туда и обратно не удалось 8 из 10 человек.

если я что-то упускаю.
Есть ли способ определить десятичную точность для мантиссы любого размера?

Значение 1, полученное из приведенной выше формулы, представляет собой наихудший случай , а наихудший случай - это число, которое обычно указывается для десятичная точность .

...