Clojure 中以撇号结尾的那些数学函数是什么?
What are those math functions end with apostrophe in Clojure?
有些数学函数以撇号结尾,例如:+'
、*'
和 -'
。
非撇号和撇号的区别是什么?
它们是普通数学函数的 "auto-promoting" 版本。
user> (* Long/MAX_VALUE 2)
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
user> (*' Long/MAX_VALUE 2)
18446744073709551614N
如果输出太大,它们将 return 比输入更大的数据类型。
这曾经是 Clojure 早期的默认行为,然后它被更改为在数学运算的输出溢出其数据类型时抛出异常。这提高了数值性能并且通常有助于发现错误。从那以后的五年左右的时间里,令人惊讶的是很少有人抱怨这种改变破坏了任何东西。决定保留溢出时抛出异常的行为,因为这几乎总是一个错误。
在实践中,大多数时候您会知道何时需要使用 BigIntegers 和 BigDecimals,并且可以使用这些数据类型的普通函数。
user> (* Long/MAX_VALUE 2N)
18446744073709551614N
在这个例子中,我使用了普通的 *
函数,并向它传递了一个 BigInteger 类型的参数(这就是 2N
中的 N
对 clojure-reader)
在某些情况下,您确实需要使用任何大小的数字,而事先并不知道它的大小,而这些函数会派上用场。到目前为止,对我来说,这些示例中的大多数都是 Whosebug 上的阶乘示例。
如果你真的想让你的数学运算溢出,那么你可以使用显式不安全的数学函数:
user> (unchecked-add Long/MAX_VALUE 2)
-9223372036854775807
有些数学函数以撇号结尾,例如:+'
、*'
和 -'
。
非撇号和撇号的区别是什么?
它们是普通数学函数的 "auto-promoting" 版本。
user> (* Long/MAX_VALUE 2)
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
user> (*' Long/MAX_VALUE 2)
18446744073709551614N
如果输出太大,它们将 return 比输入更大的数据类型。 这曾经是 Clojure 早期的默认行为,然后它被更改为在数学运算的输出溢出其数据类型时抛出异常。这提高了数值性能并且通常有助于发现错误。从那以后的五年左右的时间里,令人惊讶的是很少有人抱怨这种改变破坏了任何东西。决定保留溢出时抛出异常的行为,因为这几乎总是一个错误。
在实践中,大多数时候您会知道何时需要使用 BigIntegers 和 BigDecimals,并且可以使用这些数据类型的普通函数。
user> (* Long/MAX_VALUE 2N)
18446744073709551614N
在这个例子中,我使用了普通的 *
函数,并向它传递了一个 BigInteger 类型的参数(这就是 2N
中的 N
对 clojure-reader)
在某些情况下,您确实需要使用任何大小的数字,而事先并不知道它的大小,而这些函数会派上用场。到目前为止,对我来说,这些示例中的大多数都是 Whosebug 上的阶乘示例。
如果你真的想让你的数学运算溢出,那么你可以使用显式不安全的数学函数:
user> (unchecked-add Long/MAX_VALUE 2)
-9223372036854775807