1

Если десятичные знаки не могут быть представлены в двоичном формате, то почему компьютеры не сохраняют это число как долю двух целых чисел, которые могут быть точно представлены?Использовать фракции для определения погрешности десятичного числа

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

Это должно коренным образом решить проблему неточности, но это еще не все, что гений, так что не так с теорией?

например. вы хотите сохранить номер 0.1 и использовать его для дальнейших вычислений. Вместо того, чтобы хранить его как 0,1, вы сохраняете его как 1/10 (так что вам нужно еще несколько байтов для хранения фракций). Затем, если вам нужно умножить его на другое число, скажем, 5, теперь вы также умножаете ошибку на 3. Если вы умножаете 1/10 на 3, вы получаете 1/10 * 3 = 3/10. Всякий раз, когда вам нужно отображать его, 3/10 может стать неточным. До этого времени нет вопросов о неточности.

+1

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

+0

Попробуйте вычислить сумму 1/k для k меньше n достаточно большим, и вы увидите, что размер (в битах) вашего знаменателя является чем-то вроде экспоненциального по отношению к n. Формат с плавающей запятой сохраняет постоянный размер (в битах) для результата такого вычисления. Даже если он приблизительный, каждое вычисление с плавающей запятой выполняется в фиксированном хранилище и в фиксированном времени привязки, что не относится к «точным» дроби. – Franck

ответ

0

Десятичные значения просто не важны. Классический вариант использования - деньги, пока кто-то не был достаточно умен, чтобы понять, что вы можете работать со встроенными центами.

Важно понимать, что реальность не имеет никакого отношения к какой-либо базе, конечно, не для базы, которая получена из среднего числа пальцев Homo Sapiens.

Что касается отношений, они также не могут представлять sqrt(2) или arctan(1). И те являются типами чисел, которые появляются в действительности.

1

В дополнение к тому, что вы не сможете использовать иррациональные функции, такие как sqrt (упомянутый MSalters), у вас также есть проблема, что рациональные методы могут очень легко переполняться (например, попробуйте умножить пару вместе или использовать итеративная процедура, подобная методу Ньютона). Конечно, вы можете использовать произвольные целые числа точности, но тогда они будут медленными, и вам придется хранить эти массивные числа в памяти.

+0

Я написал тип BigRational, используя BigIntegers в качестве числителя и знаменателя, и, как правило, BigIntegers не получают совсем огромного размера. –

+0

Что вы использовали для этого? –

+0

Я написал его, чтобы помочь мне рассчитать серии MacLaurin для тригонометрии BigDecimal, возведения в степень и т. Д. С необходимой точностью. Но он может использоваться как собственный тип тоже. Обратите внимание, что это не было написано на Java, я написал BigInteger, BigDecimal и BigRational в Object Pascal (и некоторый встроенный ассемблер). –

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