有些数学函数以撇号结尾,例如:+'
,*'
和-'
。
非撇号和撇号之间有什么区别?
答案 0 :(得分:18)
他们是"自动推广"普通数学函数的版本。
user> (* Long/MAX_VALUE 2)
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
user> (*' Long/MAX_VALUE 2)
18446744073709551614N
如果输出太大,它们将返回比输入更大的数据类型。 这曾经是Clojure早期的默认行为,然后如果数学运算的输出超出了它的数据类型,则会更改为抛出异常。这提高了数字性能,通常有助于发现错误。在那之后的五年左右,令人惊讶的是,很少有人抱怨这种变化打破了任何事情。决定在溢出时保留抛出异常的行为,因为这几乎总是一个错误。
实际上,大多数情况下,您将知道何时需要使用BigIntegers和BigDecimals,并且可以使用这些数据类型的常规函数。
user> (* Long/MAX_VALUE 2N)
18446744073709551614N
在这个例子中,我使用了普通的*
函数,并向它传递了一个BigInteger类型的参数(N
2N
对于clojure的意义-reader)
在某些情况下,您确实需要使用任何尺寸编号,而不事先知道它的尺寸,这些功能会派上用场。到目前为止,大多数这些示例都是StackOverflow上的因子示例。
如果您真的希望数学运算溢出,那么您可以使用明确不安全的数学函数:
user> (unchecked-add Long/MAX_VALUE 2)
-9223372036854775807