Почему мы не можем представить 9.2 в двоичной с плавающей запятой?
blockquote>Числа с плавающей запятой (немного упрощают) систему позиционной нумерации с ограниченным числом цифр и подвижным основанием point.
Дробь может быть выражена точно с использованием конечного числа цифр в системе позиционной нумерации, если простые множители знаменателя (когда доля выражена в младших ее членах) являются факторами базы .
Основными факторами 10 являются 5 и 2, поэтому в базе 10 мы можем представить любую долю вида a / (2b5c).
С другой стороны, единственным простым множителем 2 является 2, поэтому в базе 2 мы можем представлять только фракции вида a / (2b)
Почему компьютеры использовать это представление?
blockquote>Поскольку это простой формат для работы, и он достаточно точен для большинства целей. В основном та же самая причина, по которой ученые используют «научную нотацию» и округляют их результаты до разумного количества цифр на каждом этапе.
Конечно, можно определить формат фракции, например (32) разрядный числитель и 32-разрядный знаменатель. Он мог бы представлять числа, которые не могли бы выполнять с плавающей точкой двойной точности IEEE, но в равной степени было бы много чисел, которые могут быть представлены в плавающей точке с двойной точностью, которые не могут быть представлены в таком формате фракции фиксированного размера.
Однако большая проблема заключается в том, что такой формат является болью для выполнения вычислений. По двум причинам.
- Если вы хотите иметь ровно одно представление каждого номера, то после каждого расчета вам нужно уменьшить долю до ее самых низких значений. Это означает, что для каждой операции вам в основном нужно выполнить наибольший общий расчет дивизора.
- Если после вашего расчета вы получите непредсказуемый результат, потому что числитель или знаменатель вам нужно найти ближайший представимый результат.
Некоторые языки предлагают типы фракций, но обычно они делают это в сочетании с высокой точностью, это позволяет не беспокоиться о приближении фракций, но создает собственную проблему, когда число проходит через большое количество шагов вычисления, размер знаменателя и, следовательно, хранилище, необходимое для фракции, может взорваться.
Некоторые языки также предлагают десятичные типы с плавающей запятой, которые в основном используются в сценариях, где важно, чтобы результаты, полученные компьютером, соответствовали ранее существовавшим правилам округления, которые были написаны с учетом людей (главным образом, финансовых расчетов). С ними немного сложнее работать, чем с двоичной плавающей точкой, но самая большая проблема заключается в том, что большинство компьютеров не предлагают аппаратную поддержку для них.