3

vsprintf を使用してコンテンツをファイルに書き込みます。

出力形式は次のとおりです。

"tt2:%f, tt2:%x", tt2, *((int *)&tt2)

Linux:</p>

gcc 4.4.5: -O2 -ffloat-store

linux.in ファイルは次のようになります。

tt2:30759. 257812、tt2:46f04e84

ウィンドウ:</p>

vs2005 sp1: /O2 Precise (/fp:precise)

窓で。ファイル内は次のようになります。

tt2:30759. 257813、tt2:46f04e84

なぜそれが違うのですか?

==================================

私は自分のケースの理由を見つけました。

Windows では、ofstream を使用してファイルに出力します。それはc ++ libです。

Linuxでは、書き込みを使用してファイルに出力します。clibです。

Linuxでofstreamを使用すると、出力は同じです。

やっぱりみんなありがとう〜

4

1 に答える 1

1

浮動小数点数は、コンピューターに 2 進数で格納されます。それらを 10 進浮動小数点に出力する場合、複数の正しい表現があります。あなたの場合、どちらも元のバイナリ浮動小数点値に変換されるため、どちらも正しいです。GCC を使用してコンパイルしたこのファイルの出力を見てください。

#include <stdint.h>
#include <stdio.h>

int main()
{
    float a = 30759.257812f;
    float b = 30759.257813f;

    printf("%x\n%x\n", *(uint32_t *)&a, *(uint32_t *)&b);
}

出力:

46f04e84
46f04e84

したがって、 の実装でprintfは、2 つの 10 進浮動小数点数のいずれかを表示することを選択できます。

于 2012-09-07T08:00:45.117 に答える