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