2024年Clojure状态调查!中分享您的想法。

欢迎!有关本网站运作方式的相关信息,请参阅关于页面。

0
Java交互操作

如果两个参数都是装箱的,那么使用双精度浮点数进行零除将抛出异常,否则不会抛出异常

`
Clojure 1.9.0-beta1
用户=> (/ 5.0 0.0)

无限

用户=> (/ (identity 5.0) 0.0)

无限

用户=> (/ 5.0 (identity 0.0))

无限

用户=> (/ (identity 5.0) (identity 0.0))
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:163)
`

3个答案

0

评论者: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)
用户=>
`

0

评论者:slipset

关于处理方法有什么想法吗?
对于本地对象进行除以零的抛出和在封装类型中允许这种操作,似乎是一个重大变化,并且测试预期在封装类型除以零的情况下会抛出一个异常。

0
参考:https://clojure.atlassian.net/browse/CLJ-2244 (glchapman 报告)
...