Если я правильно понимаю плавающие точки IEEE, они не могут точно представлять некоторые значения. Они точны в очень ограниченных случаях, и почти каждая операция с плавающей запятой увеличивает накопленные приближения. Также еще один недостаток — «минимальный шаг» растет с показателем степени.
Не лучше ли предложить более конкретное представление?
Например, используйте 20 битов для «десятичной» части, но не все 2 ^ 20 значений, а только 1000000, что дает полное 1 / миллионное наименьшее возможное представление / разрешение, и используйте остальные 44 бита для целочисленной части, давая вполне диапазон. Таким образом, числа с плавающей запятой могут быть вычислены с использованием целочисленной арифметики, которая может даже закончиться быстрее. А в случае умножения, сложения и вычитания не происходит накопления аппроксимаций, единственные возможные потери — при делении.
Эта концепция основана на том факте, что 2 ^ n значения не являются оптимальными для представления десятичных чисел, например, 1 не делит это хорошо на 1024 части, но довольно хорошо делит на 1000. Технически, это не позволяет использовать полную точность, но я могу вспомнить множество случаев, когда LESS может быть БОЛЬШЕ.
Естественно, такой подход в некотором смысле потеряет и дальность, и точность, но во всех случаях, когда конечности не требуются, такое представление звучит как хорошая идея.
То, что вы описываете как предложение, является фиксированная точка арифметика. Теперь, это не обязательно о лучше или же хуже; у каждого представления есть свои преимущества и недостатки, которые часто делают одно более подходящим, чем другое, для какой-то конкретной цели. Например:
Арифметика с фиксированной запятой не вносит ошибок при операциях, таких как сложение и вычитание, что делает ее пригодной для финансовых расчетов. Вы, конечно, не хотите хранить деньги как значения с плавающей запятой.
Предположение: возможно, арифметика с фиксированной точкой проще с точки зрения реализации, что, вероятно, приводит к меньшим, более эффективным схемам.
Представление с плавающей точкой охватывает чрезвычайно большой диапазон: оно может использоваться для хранения действительно больших чисел (~ 1040 для 32-разрядного числа с плавающей запятой, 10308 для 64-битного) и очень маленьких положительных (~ 10-320) за счет точности, в то время как представление с фиксированной точкой линейно ограничено его размером.
Точность с плавающей точкой не распределена равномерно по представимому диапазону. Вместо этого большинство значений (с точки зрения количества представимых чисел) лежит в единичном шаре около 0. Это делает его очень точным в диапазоне, в котором мы работаем чаще всего.
Вы сказали это сами:
Технически, это не использовать полную точность, но я
может придумать множество случаев, когда МЕНЬШЕ может быть БОЛЬШЕ
Именно в этом весь смысл. Теперь, в зависимости от поставленной задачи, выбор должен быть сделан. Не существует универсального представления, это всегда компромисс.
Других решений пока нет …