は私がNaNの上の任意の数学演算の結果が戻って私にはNaNを与えるべきであると思ったが、Math.round(Float.NaN) == 0
Math.round()はなぜNaN引数に対して0を返しますか?
Math.round()のような行動のための根拠は何ですか?
不思議なことに、C#が異なる動作をします:http://msdn.microsoft.com/en-us/library/75ks3aby.aspx
は私がNaNの上の任意の数学演算の結果が戻って私にはNaNを与えるべきであると思ったが、Math.round(Float.NaN) == 0
Math.round()はなぜNaN引数に対して0を返しますか?
Math.round()のような行動のための根拠は何ですか?
不思議なことに、C#が異なる動作をします:http://msdn.microsoft.com/en-us/library/75ks3aby.aspx
母。私は頭の中で自分自身を叩きたい。
Math.round(double)
は長いを返し、長いはNaN
することはできません。代替は例外です。
C#では、結果はまだdouble
です。
浮動小数点数float –
@HunterMcMillenはい、' long Math.round(double) 'はどのように定義されていますか? Javaで。この答えは、なぜNaNではなく、「0」で返されるのかを説明します。もしそれが 'double Math.round(double) 'だったら、C#の方が適切かもしれません... –
@Hunter:操作*は' long'を返します。 –
Math.round()
は、(long)Math.floor(a + 0.5d)
と定義されます。
a
がNaN
であれば、a+0.5d
はNaN
です。Math.floor()
は、NaN
に渡されたときにNaN
を返すStrictMath.floor()
にデリゲートされます。long
からNaN
をキャストするとき、それは0を返しますので、最終的に、それはキャスト戻って、この問題を徹底的にthis questionで議論された理由にダウンしています。
少し、実装に少し掘りに+1!適切な関数の[Open Source JDK]コードへのリンクがありますか? –
+1 Java 7では、この問題が[Java 6でMath.round(0.499999999999999917)が1になる理由]のためこの定義が削除されました(http://vanillajava.blogspot.co.uk/2012/04/why-mathround0499999999999999917 -rounds.html) –
@pstが言っているように、そのNaNに対して定義された通常の振る舞い: "引数がNaNの場合、結果は0です"。 –
根拠は、NaNで呼び出されたときに 'Math.round()'にバグがあったため、将来の 'Math.round()'の呼び出しを損なう可能性があります:http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=4755500 –
違いはありそうです。 Javaの場合は 'long'を返します。これは' Double.NaN'にはできませんが、Cでは 'double'を返します。 –