2012-04-12 7 views
18

は私がNaNの上の任意の数学演算の結果が戻って私にはNaNを与えるべきであると思ったが、Math.round(Float.NaN) == 0Math.round()はなぜNaN引数に対して0を返しますか?

Math.round()のような行動のための根拠は何ですか?

不思議なことに、C#が異なる動作をします:http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

+0

@pstが言っているように、そのNaNに対して定義された通常の振る舞い: "引数がNaNの場合、結果は0です"。 –

+0

根拠は、NaNで呼び出されたときに 'Math.round()'にバグがあったため、将来の 'Math.round()'の呼び出しを損なう可能性があります:http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=4755500 –

+1

違いはありそうです。 Javaの場合は 'long'を返します。これは' Double.NaN'にはできませんが、Cでは 'double'を返します。 –

答えて

13

母。私は頭の中で自分自身を叩きたい。

Math.round(double)長いを返し、長いNaNすることはできません。代替は例外です。

C#では、結果はまだdoubleです。

+0

浮動小数点数float –

+0

@HunterMcMillenはい、' long Math.round(double) 'はどのように定義されていますか? Javaで。この答えは、なぜNaNではなく、「0」で返されるのかを説明します。もしそれが 'double Math.round(double) 'だったら、C#の方が適切かもしれません... –

+0

@Hunter:操作*は' long'を返します。 –

27

Math.round()は、(long)Math.floor(a + 0.5d)と定義されます。

  1. aNaNであれば、a+0.5dNaNです。
  2. Math.floor()は、NaNに渡されたときにNaNを返すStrictMath.floor()にデリゲートされます。
  3. longからNaNをキャストするとき、それは0

を返しますので、最終的に、それはキャスト戻って、この問題を徹底的にthis questionで議論された理由にダウンしています。

+0

少し、実装に少し掘りに+1!適切な関数の[Open Source JDK]コードへのリンクがありますか? –

+4

+1 Java 7では、この問題が[Java 6でMath.round(0.499999999999999917)が1になる理由]のためこの定義が削除されました(http://vanillajava.blogspot.co.uk/2012/04/why-mathround0499999999999999917 -rounds.html) –

関連する問題