5

私は、CIL バイトコードを C ソース コードに変換してマシンで使用するプログラムを作成しています。10 進数との変換による浮動小数点定数の不正確さが心配でした。いくつかの調査を行った後、C (C++ ではなく) が浮動小数点定数の 16 進表記を受け入れることができるはずであることを発見しました。

試してみることにしましたが、MS VC9 では何を試してもエラーが発生します。ここに私がしようとしているものがあります:

// Switches: /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FD /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TC

#include <tchar.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    double d = 0x1.0p+1;    // error C2059
    //double d = 0x1p+1;    // doesn't work either
    //double d = 0x1p1;     // doesn't work either
    //double d = 0x1.0p1;   // doesn't work either

    printf( "%f\n", d );

    return 0;
}

これにより、1x2^1 から 2 が出力されると予想していましたが、代わりに次のコンパイラ エラーが発生します。

error C2059: syntax error : 'bad suffix on number'

C++ はこの構文をサポートしていないことに気付きました (または読んだことがあります) が、これは/TCC でコンパイルされているため*.c、適切な測定のためにファイル名も使用したことに注意してください。

ここで何か間違ったことをしているのですか、それとも VC9 が標準に準拠していないだけですか?

4

2 に答える 2

8

コードに問題はありません。浮動小数点の 16 進定数は C99 標準で C に追加されましたが、MSVC は古い C90 標準のみをサポートします (//単一行のコメントやlong long型などのいくつかの拡張機能を使用)。

于 2013-08-12T05:36:51.887 に答える