0

単純なものが欠けているかどうかはわかりませんが、次のコードは失敗します (a と b は同じであることを意味します)。

a=single(2147483584)
f=fopen('test','wb');
fwrite(f,a,'int32')
fclose(f); 
f=fopen('test','rb');
b=fread(f,inf,'int32');
fclose(f)
a
b

出力付き:

a = 
   2.1475e+009
b =
   -2.1475e+009

次のコードは成功します。

a=single(2147483583)
f=fopen('test','wb');
fwrite(f,a,'int32')
fclose(f); 
f=fopen('test','rb');
b=fread(f,inf,'int32');
fclose(f)
a
b

出力付き:

a = 
   2.1475e+009
b =
   2.1475e+009

誰かが理由を知っていますか?

4

1 に答える 1

3

Matlabについてはよくわかりませんが、ここで何が起こっているのかはかなり明らかなようです。浮動小数点に変換aし、その変換の結果を32ビットの符号付き整数として格納します。ただし、整数に最も近い単精度IEEE 754浮動小数点数2147483584は、、2147483648.0または2**31です。32ビット整数は範囲内の値のみを表すことができるため、この値を整数として書き込むと、の代わりにモジュロでラップされて与えられる[-2**31, 2**31-1]ように見えます。2**32-2**312**31

対照的に、に最も近い単精度浮動小数点21474835832147483520.0、であり、32ビット整数に適合します

于 2012-07-01T08:09:04.767 に答える