评论者: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)
Javadoc:(javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
结果:存储在变量 1, 2, 3,e中的异常
用户=> (/ 5.0 0.0)
无限
用户=> (/ (identity 5.0) (identity 0.0))
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:158)
用户=>
`