2017-01-04 7 views

答えて

17

通常の数学関数の「自動促進」バージョンです。

user> (* Long/MAX_VALUE 2) 
ArithmeticException integer overflow clojure.lang.Numbers.throwIntOverflow (Numbers.java:1501) 
user> (*' Long/MAX_VALUE 2) 
18446744073709551614N 

出力が大きすぎると、入力よりも大きなデータ型が返されます。 これはClojureの早い段階ではデフォルトの動作でしたが、数学演算の出力がデータ型をオーバーフローさせた場合は例外をスローするように変更されました。これにより数値的なパフォーマンスが向上し、一般的にバグの発見に役立ちました。それ以来、5年ほどの間に、この変更について驚くほど少数の人々が何かを壊していると訴えてきました。これはほとんど常にバグであるため、オーバーフローで例外をスローする動作を保つことに決めました。

実際には、ほとんどの場合、BigIntegerとBigDecimalを使用する必要があり、通常の関数をこれらのデータ型で使用できます。この例では

user> (* Long/MAX_VALUE 2N) 
18446744073709551614N 

私は、通常の*機能を使用し、それをタイプのBigIntegerのだった引数を渡された(つまり、2NNは、Clojureは、読者に何を意味するかだ)

いくつかの例があります。あなたが実際にサイズを知らずに任意のサイズの番号で作業する必要がある場合、これらの機能は便利です。これまでの私の例のほとんどは、StackOverflowの階乗的な例です。

あなたが本当にあなたの数学の操作は、あなたが明示的に危険な数学関数を使用することができますオーバーフローする場合:

user> (unchecked-add Long/MAX_VALUE 2) 
-9223372036854775807 
+3

典型的な答えを。正確で非常に徹底的。 – amalloy

+2

完了するには: '* unchecked-math *'も 'true'に設定できます – ClojureMostly

関連する問題