浮動小数点数の長さが32ビットと40ビットの間で変わる 質問する

浮動小数点数の長さが32ビットと40ビットの間で変わる 質問する

値をファイルにエクスポートするときに奇妙な問題が発生しましたfloat。すべての浮動小数点数が同じ長さであることを期待していましたが (当然ですが)、私のプログラムはそれを 32 ビットの数値としてエクスポートすることもあれば、40 ビットの数値としてエクスポートすることもあります。この動作がまだ表示されるプログラムの最小限の動作例は次のとおりです。

#include <stdio.h>

const char* fileName = "C:/Users/Path/To/TestFile.txt";
float array [5];

int main(int argc, char* argv [])
{
    float temp1 = 1.63006e-33f;
    float temp2 = 1.55949e-32f;

    array[0] = temp1;
    array[1] = temp2;
    array[2] = temp1;
    array[3] = temp2;
    array[4] = temp2;

    FILE* outputFile;
    if (!fopen_s(&outputFile, fileName, "w")) 
    {
        fwrite(array, 5 * sizeof(float), 1, outputFile);
        fclose(outputFile);
    }

     return true;
}

出力ファイルには、それぞれ 4 バイトが float を表す 20 (5 x 4) バイトが含まれると予想されます。しかし、次のような結果になります。

 8b 6b 07 09      // this is indeed 1.63006e-33f 
 5b f2 a1 0d 0a   // I don't know what this is but it's a byte too long
 8b 6b 07 09      
 5b f2 a1 0d 0a   
 5b f2 a1 0d 0a 

したがって、浮動小数点はtemp24 バイトではなく 5 バイトを占め、ファイルの合計長は 23 になります。どうしてこんなことが可能なのでしょうか?! 数値は非正規数になるほど小さいわけではなく、サイズに差が生じる他の理由は考えられません。

64 ビット Windows 7 システムで MSVC 2010 コンパイラを使用しています。

注記: 私はすでにここで非常によく似た質問をしましたが、問題がより一般的であることに気づいたので、より簡潔な方法で再投稿することにしました。 QDataStreamは32ビットの浮動小数点数を使用することもあれば、40ビットの浮動小数点数を使用することもある

ベストアンサー1

問題は、Windows ではテキスト ファイルとバイナリ ファイルを区別する必要があることです。ファイルはテキストとして開かれます。つまり、0d(改行) が書き込まれるたびに0a(復帰) が挿入されます。次のようにファイルを開きます。

if (!fopen_s(&outputFile, fileName, "wb"))

残りは前と同じようにすれば動作するはずです。

おすすめ記事