4

これが私のコードです:</ p>

int a = 0x451998a0;
float b = *((float *)&a);
printf("coverto float: %f, %.10lf\n", b, b);

Windowsでは、出力は次のとおりです。

coverto float: 2457.539063, 2457.5390625000

Linuxでは、出力は次のとおりです。

coverto float: 2457.539062, 2457.5390625000

出力が同じであることを確認する方法はありますか?

4

3 に答える 3

7

表示されている動作は、Windows のprintf()機能が Linux の機能とは異なる方法で実装されているという事実の結果ですprintf()。ほとんどの場合、違いはprintf()数値の丸めを実装する方法にあります。

printf()どちらのシステムの内部でどのように機能するかは、実装の詳細です。printf()したがって、システムは、浮動小数点値の表示方法について、そのようなきめ細かい制御を提供する可能性は低いです。

それらを同じに保つには、次の 2 つの方法があります。

  1. 表示中よりも計算中により多くの精度を使用します。たとえば、一部の関数電卓やグラフ電卓ではdouble、すべての内部計算に精度が使用されますが、結果は精度のみで表示されますfloat

  2. クロスプラットフォームprintf()ライブラリを使用します。このようなライブラリは、通常、表示する桁を決定するために必要な計算がプラットフォームにとらわれないため、すべてのプラットフォームで同じ動作をする可能性があります。

しかし、これはあなたが思っているほど大きな問題ではありません。出力間の差は 0.000001 です。これは、2 つの値のいずれとも ~0.0000000004% の差です。表示エラーは本当にごくわずかです。

これを考慮してください:ロサンゼルスとニューヨークの間の距離は 2464 マイルで、これは表示出力の数値と同じ大きさです。0.000001 マイルの差は 1.61ミリメートルです。もちろん、そのような精度で都市間の距離を測定することはありません。:-)

于 2012-09-10T06:12:05.913 に答える
0

同じ printf() 実装を使用すると、同じ出力が表示される可能性が高くなります。現在の状況によっては、両方の OS で GNU GCC を使用するか、printf() ソース コードを取得してプロジェクトに追加する方が簡単な場合があります (問題なくグーグルで検索できるはずです)。

ところで-その16進数が何をエンコードするかを実際に確認しましたか?切り上げるか、切り下げるか。625 はそれ自体が丸められている可能性が高いため、63 に丸める必要があると想定しないでください。

于 2012-09-10T06:49:29.110 に答える
0

明らかな答えは、出力の精度を下げることです。一般に、何らかの計算が関係している場合、実際の浮動小数点値が同一であることを確認することさえできません。また、浮動小数点値が等しい場合でも、どのようprintfに 丸められるかは実装で定義されます。ostream

一般に、C++ は、2 つの実装が同じ結果を生成することを保証しません。この特定のケースでは、重要な場合は、変換を行う前に手動で丸めを行うことができますが、実際の浮動小数点値が異なるため、時折問題が発生することがあります。これは、実際には、同じコンパイラーでさまざまなレベルの最適化を行った場合でも発生する可能性があります。したがって、(プログラム全体をアセンブラーで作成する以外に) 何をしようとしても、最終的には負け戦になることは間違いありません。

于 2012-09-10T08:25:20.140 に答える