评论由:slipset 提出
所以,我认为有些除以零是未定义的。
如果去除
`
if(yops.isZero((Number)y))
throw new ArithmeticException("Divide by zero");
`
则
(/ (identity 5.0) (identity 0.0))
返回了无穷大,类似于未装箱版本。
这样做也会改变
(/ 5 0)
它变成了1/0
,而之前是抛出除以零的异常。
从 Numbers.java 我们看到,未装箱的数学运算没有防止除以零的保护
`
static public double divide(double x, double y){
return x / y;
}
`
而装箱版本有
`
static public Number divide(Object x, Object y){
if (isNaN(x)){
return (Number)x;
} else if(isNaN(y)){
return (Number)y;
}
Ops yops = ops(y);
if(yops.isZero((Number)y))
throw new ArithmeticException("Divide by zero");
return ops(x).combine(yops).divide((Number)x, (Number)y);
}
`
这种不一致性在 Clojure 1.8 中也可重现
`
Clojure 1.8.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_144-b01
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
来源:(source function-name-here)
Java文档:(javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
结果:存储在 vars 1, 2, 3, 一个异常在 e
user=> (/ 5.0 0.0)
无穷大
user=> (/ (identity 5.0) (identity 0.0))
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:158)
user=>
`