为什么range
返回print(1.0 / 0)
而inf
返回NaN而print(0.0 / 0)
在编译时失败?
似乎Swift编译时检查整数除以0而不是浮点数/双精度数?
有人可以解释为什么会这样吗?
答案 0 :(得分:2)
用于浮点数的IEEE 754标准及其算法定义了"无穷大"并且"不是数字"作为有效值。它们可能不是有效的"在数学上有用的意义上......但它们是标准所定义的。使用浮点数的代码需要来自某些操作的那些值,并且如果需要可以检查/响应它们,因此Swift尊重FP数学的标准。
对于整数算术,没有相应的跨语言,独立于CPU的标准。在Swift之外,它通常假设将整数除以零是Bad Thing,因为你不必知道它是否会停止程序或产生不正确的结果。
Swift的默认行为是"安全"对于所有整数运算,因此任何会溢出该类型边界的操作都会导致运行时异常。 (包括除以零。)
当您将0 / 0
放在文字代码中时,会出现编译时错误,因为Swift在编译时对常量执行算术运算。 (如果您有let x = 1 + 2
之类的代码,那么在运行时计算生成的3
是没有意义的,因为它对于您的程序的所有运行都是常量。)