0

Если я правильно понимаю плавающие точки IEEE, они не могут точно представить некоторые значения. Они точны в очень ограниченных случаях, и почти каждая операция с плавающей запятой увеличивает накопленные аппроксимации. Кроме того, еще один недостаток - «минимальный шаг» растет с показателем.Реализация с плавающей запятой IEEE, точность и накопление приближений

Не лучше ли предложить более конкретное представление?

Например, используйте 20 бит для «десятичной» части, но не для всех значений 2^20, а всего лишь 1000000, что дает полное 1/миллионное наименьшее возможное представление/разрешение и использует остальные 44 бита для целая часть, дающая довольно широкий диапазон. Таким образом, число «с плавающей запятой» может быть рассчитано с использованием целочисленной арифметики, которая может даже закончиться быстрее. А в случае умножения, сложения и вычитания нет накопления аппроксимаций, единственная возможная потеря - во время деления.

Эта концепция основана на том, что значения 2^n не являются оптимальными для представления десятичных чисел, например. 1 не делит это на 1024 части, но он довольно хорошо делит на 1000. Технически это не позволяет использовать полную точность, но я могу придумать множество случаев, когда LESS может быть БОЛЕЕ.

Естественно, что такой подход потеряет как диапазон, так и точность, но во всех случаях, когда конечности не требуются, такое представление кажется хорошей идеей.

+0

SO не то, что нужно задавать этот вопрос! – Paddyd

+0

Ваша система не может точно представить некоторые значения и точна в очень ограниченных случаях. Кроме того, умножение будет также * потерять точность. – usr2564301

+1

IEEE - институт стандартизации, вы имеете в виду стандарт IEEE 754. И уже существует стандарт для десятичной точки с плавающей запятой: http://en.wikipedia.org/wiki/Decimal_floating_point –

ответ

3

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

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

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

  • с плавающей точкой представление охватывает чрезвычайно широкий диапазон: он может быть использован для хранения очень больших чисел (~ 10 для 32-битной плавающей точкой, 10 для 64-битной) и очень малых положительных (~ 10 -320) за счет точности, тогда как представление с фиксированной запятой линейно ограничено его размером.

  • Точность с плавающей точкой равномерно распределена по представленному диапазону. Вместо этого большинство значений (в терминах числа представимых чисел) лежит в единичном шаре вокруг 0. Это делает его очень точным в диапазоне, в котором мы работаем чаще всего.

Вы сказали сами:

Технически это преминув использовать в полной точности, но я могу думать о большом количестве случаев, когда МЕНЬШЕ может быть более

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

+0

Я был под впечатлением представления IEEE с плавающей запятой, должно было быть «одного размера подходит всем», учитывая, что каждый язык программирования, который я видел, содержит только реальные значения IEEE. Конечно, сценарий, который я описываю, очень прост в реализации, но все же ... –

+1

Как система с фиксированной точкой, OP являются нетрадиционными и расточительными. Более эффективно представлять миллионные числа в 64-разрядном целое, чем разбить 64 бита на 20 и 44 и отбросить некоторые из значений, которые могут быть представлены в 20 бит, не говоря уже о сложности любой операции в этой системе. –

+0

@PascalCuoq - это был просто пример, очевидно, вы можете создать свою собственную реализацию на основе требований к диапазону и точности. Однако вам все равно придется держать его на 8, 16, 32 или 64 бит, потому что в противном случае накладные расходы на аппаратное обеспечение будут значительными при использовании произвольных типов ширины бит. –

Смежные вопросы