Плавающая точка по своей сути моделирует вещественные числа с ограниченной точностью. Существует только конечное число битовых шаблонов, но бесконечное (непрерывное!) число действительных чисел. Конечно, он делает все возможное, возвращая самое близкое представимое вещественное число к точным входным данным. Ответы, которые слишком малы для прямого представления, вместо этого представлены нулем. Деление на ноль является ошибкой в действительных числах. Однако в плавающей запятой, поскольку из этих очень маленьких ответов может возникнуть ноль, может быть полезно рассматривать x / 0,0 (для положительного x) как «положительную бесконечность» или «слишком большой для представления». Это больше не полезно для x = 0,0.
Лучшее, что мы могли бы сказать, это то, что деление нуля на ноль на самом деле означает «деление чего-то маленького, что нельзя отличить от нуля, на что-то маленькое, что нельзя отличить от нуля». Что ответить на это? Ну, нет ответа для точного случая 0/0, и нет хорошего способа трактовать его неточно. Это будет зависеть от относительных величин, поэтому процессор в основном пожимает плечами и говорит: «Я потерял всю точность — любой результат, который я дал бы вам, будет вводящим в заблуждение», возвращая Not a Number.
Напротив, при делении целого числа на ноль делитель действительно может означать только ноль. Невозможно придать этому последовательное значение, поэтому, когда ваш код запрашивает ответ, он действительно делает что-то нелегитимное.
(Во втором случае это целочисленное деление, но не в первом из-за правил продвижения C. 0 может быть взят как целочисленный литерал, и поскольку обе стороны являются целыми числами, деление является целочисленным делением. В первом случае тот факт, что x
является двойным, приводит к удвоению дивиденда. Если вы замените 0
на 0.0
, это будет деление с плавающей запятой, независимо от типа x
.)
person
wnoise
schedule
01.08.2011