2016-09-19 96 views
1

为什么print(1.0/0)返回infprint(0.0/0)返回NaN和print(0/0)在编译时失败?编译时间检查除以0除以Swift

似乎Swift有编译时间检查整数除以0,但不是浮动/双打?

有人可以解释为什么会出现这种情况吗?

回答

2

浮点数及其算术的IEEE 754标准将“无限”和“非数字”定义为有效值。在数学上有用的意义上,它们可能不是“有效的”......但它们是标准定义的。与浮点数一起使用的代码预计这些值来自某些操作,并且可以根据需要检查/响应这些值,所以Swift尊重FP数学的标准。

整数算术没有相应的跨语言,与CPU无关的标准。在Swift之外,通常假设将整数除以零是Bad Thing,因为您不一定知道它是否会暂停程序或产生不正确的结果。

对于所有整数算术,Swift的默认行为是“安全的”,所以任何溢出该类型边界的操作都会导致运行时异常。 (这包括除数为零。)

当你把0/0在文字代码,你会得到一个编译时错误因为斯威夫特在编译时间常数进行运算。 (如果您的代码类似于let x = 1 + 2,那么在运行时计算得到的3是没有意义的,因为它对于程序的所有运行都是恒定的。)