2

JNI ネイティブから Java に float を返す関数があります。これは簡単な呼び出しのはずですが、奇妙な結果が得られます。

私のテストケースでは、値 1.61863e+010 を Java に返しています。コードは次のとおりです。

cout << result << endl;  cout.flush(); // get 1.61863e+010
return (jfloat) result;

(明確にするために、cout.precision(6) の場合、16186300000.000000 を取得します)

ただし、私の Java コードは 1.61863004E10 を受信して​​います。私が使うとき

DecimalFormat formatter = new DecimalFormat("###,###.######");
System.out.println(formatter.format(result));

16,186,300,416 を取得します。

この 416 はどこから来たのですか? jfloat と float はどちらも 32 ビット IEEE float であると考えていたので、精度が失われることはありません。

どうもありがとう。

4

2 に答える 2

6

float10 進数で 7 桁の精度 (23 ビットの仮数、正規化された数値の暗黙のビット) しかないa を使用しています。したがって、それ以降は事実上ノイズと見なす必要があります。値は実際には変更されていません。表示される表現が Java と C++ 実装の間で異なるだけです。

于 2012-06-20T16:44:43.887 に答える
3

a の精度である有効数字 7 桁に丸められる可能性が高い C++ プログラムですfloat。Java で値を 7 桁に丸めると、同じ数値になります。DecimalFormat を使用すると、デフォルトで最も近い整数が出力されます。

System.out.println("(float) " + 16186300000.0 + 
                   " is actually " + new BigDecimal((float) 16186300000.0));

版画

(float) 1.61863E10 is actually 16186300416
于 2012-06-20T16:46:17.767 に答える