首先让我们看一段程序:
func main() {
fmt.Printf("%v",300.0/0.0)
}
结果:
prog.go:9:23: division by zero
编译器报错了, 这符合我们传统的数学概念:除数不能为0, 再看一段程序:
func main() {
var x float64 = 0.0
fmt.Printf("%v",300.0/x)
}
这段程序会输出什么结果呢?
+Inf
什么是 +Inf 呢? 正无穷大 ! 那除数能为0了?
实际上,根据IEEE-754标准,这种情况也许允许的, 下面是原文:
The divideByZero exception shall be signaled if and only if an exact infinite result is defined for an operation on finite operands. The default result of divideByZero shall be an ∞ correctly signed according to the operation:
― For division, when the divisor is zero and the dividend is a finite non-zero number, the sign of the
infinity is the exclusive OR of the operands’ signs (see 6.3).
― For logB(0) when logBFormat is a floating-point format, the sign of the infinity is minus (−∞).
上面的意思是:
当且仅当为有限操作数上的操作定义了准确的无限结果时,才应发信号通知divideByZero异常。 divideByZero的默认结果应为∞, 它的符号则参考根据下面的操作:
- 对于除法,当除数为零且被除数为有限的非零数时,无穷大的符号是操作数符号的异或(见6.3)。
- 对于logB(0),当logBFormat是浮点格式时,无穷大的符号为负(-∞)。
所以Golang在运行时,对于除数为0的情况不报错是符合标准的。 那Golang对于除数为0的运算有哪些规则呢?
1. 所有被0除的整数都得报错
2. 就算使用符号 _ , 需要报错的地方还得报错
3. 所有除0的浮点数都不会报错
4. 所有除0的复数都不会报错