Что касается аргументов, давайте предположим, что у нас есть процессор, который представляет число с плавающей запятой с 7 значащими десятичными цифрами, и мантисса, скажем, с 2 десятичными цифрами.Таким образом, теперь число 1e8 будет сохранено как
1.000 000 e 08
(где «.» И «e» не нужно хранить на самом деле.)
Итак, теперь вы хотите вычислить «1e8 -1" .1 представляется как
1.000 000 e 00
Теперь, чтобы выполнить вычитание, мы сначала делаем вычитание с бесконечной точностью, а затем нормализуем так, чтобы первая цифра перед "."находится между 1 и 9, и, наконец, округляется до ближайшего представимого значения (с, скажем, безубыточным).Результат бесконечной точности "1e8 - 1" равен
0.99 999 999 e 08
или нормализован
9.9 999 999 e 07
Как можно видеть, результат бесконечной точности требует еще одну цифру в значении, чем нашаархитектура фактически обеспечивает;следовательно, мы должны округлить (и повторно нормализовать) бесконечно точный результат до 7 значащих цифр, что приведет к
1.000 000 e 08
Следовательно, вы получите «1e8 - 1 == 1e8», и ваш цикл никогда не завершится.
Теперь, на самом деле, вы используете двоичные числа с плавающей запятой IEEE 754, которые немного отличаются, но принцип примерно такой же.