Ert*_*tin 12 lisp functional-programming clojure clojurescript
有迹象表明,与像省略号结尾一些数学函数:+',*',和-'.
非撇号和撇号之间有什么区别?
Art*_*ldt 18
它们是普通数学函数的"自动升级"版本.
user> (* Long/MAX_VALUE 2)
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501)
user> (*' Long/MAX_VALUE 2)
18446744073709551614N
Run Code Online (Sandbox Code Playgroud)
如果输出太大,它们将返回比输入更大的数据类型.这曾经是Clojure早期的默认行为,然后如果数学运算的输出溢出了它的数据类型,它就会被更改为抛出异常.这提高了数字性能,通常有助于发现错误.在那之后的五年左右,令人惊讶的是,很少有人抱怨这种变化打破了任何事情.决定保持溢出抛出异常的行为,因为这几乎总是一个bug.
实际上,大多数情况下,您将知道何时需要使用BigIntegers和BigDecimals,并且可以使用这些数据类型的常规函数.
user> (* Long/MAX_VALUE 2N)
18446744073709551614N
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我使用的正常*功能,并通过它那类型的参数BigInteger的(这是什么N的2N手段,Clojure的阅读器)
在某些情况下,您确实需要使用任何大小的数字,而不事先知道它的大小,这些功能派上用场.到目前为止,大多数这些示例都是StackOverflow上的因子示例.
如果您真的希望数学运算溢出,那么您可以使用明确不安全的数学函数:
user> (unchecked-add Long/MAX_VALUE 2)
-9223372036854775807
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |