2016-09-19 3 views
1

Почему print(1.0/0) возвращает inf в то время как print(0.0/0) возвращает NaN и print(0/0) не удается во время компиляции?Проверка времени компиляции для деления на 0 в Swift

Кажется, что Swift имеет время проверки компиляции целых чисел, деленное на 0, но не для поплавков/парных?

Может ли кто-нибудь объяснить, почему это так?

ответ

2

Стандарт IEEE 754 для чисел с плавающей точкой и их арифметика определяет «бесконечность» и «не число» в качестве допустимых значений. Они не могут быть «действительными» в смысле математически полезного ... но они соответствуют стандарту. Код, который работает с номерами с плавающей запятой ожидает этих значений из определенных операций и может проверить/отреагировать на них, если потребуется, поэтому Свифт уважает стандарт для математики FP.

Для целочисленной арифметики не существует соответствующего межъязыкового, независимого от процессора стандарта. Вне Swift обычно предполагается, что деление целых чисел на ноль - Bad Thing, потому что вы не обязательно знаете, остановит ли он программу или произведет неверный результат.

Поведение по умолчанию Swift должно быть «безопасным» для всей целочисленной арифметики, поэтому любая операция, которая переполняет границы типа, приводит к исключению во время выполнения. (Это включает в себя деление на ноль.)

Когда вы 0/0 в буквальном коде, вы получите время ошибку в компиляции, потому что Swift выполняет арифметические константы во время компиляции. (Если у вас есть код let x = 1 + 2, то нет смысла вычислять полученный результат 3 во время выполнения, потому что он постоянный для всех прогонов вашей программы.)

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