67

Windows上のNetbeansで最新のgccを使用しています。なぜ機能しないlong doubleのですか?printf指定子は間違っ%lfていますか?

コード:

#include <stdio.h>

int main(void)
{
    float aboat = 32000.0;
    double abet = 5.32e-5;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);
    printf("%f can be written %e\n", abet, abet);
    printf("%lf can be written %le\n", dip, dip);

    return 0;
}

出力:

32000.000000 can be written 3.200000e+004
0.000053 can be written 5.320000e-005
-1950228512509697500000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000.000000
can be written 2.725000e+002
Press [Enter] to close the terminal ...
4

8 に答える 8

49

printfのマンページから:

l(ell)次の整数変換はlongintまたはunsignedlong int引数に対応するか、次のn変換はlong int引数へのポインターに対応するか、次のc変換はwint_t引数または次のs変換に対応しますwchar_t引数へのポインタに対応します。

a、A、e、E、f、F、g、またはG変換に続くLAは、長いdouble引数に対応します。(C99は%LFを許可しますが、SUSv2は許可しません。)

だから、あなたはしたい%Le、ではなく%le

編集:いくつかのさらなる調査は、MingwがMSVC / win32ランタイム(printfのようなもののために)を使用していることを示しているようです-これはlongdoubleからdoubleにマップします。したがって、ネイティブのlong doubleを提供するコンパイラ(gccなど)と、混乱していないように見えるランタイムを混在させることができます。

于 2010-11-03T16:25:04.133 に答える
48

はい-の場合long double、を使用する必要があります%Lf(つまり、大文字の「L」)。

于 2010-11-03T16:23:45.080 に答える
29

MinGWを使用している場合、問題は、デフォルトでMinGWがI/O応答を使用することです。80ビット浮動小数点数をサポートしないMicrosoftCランタイムのフォーマット関数(Microsoftランドではlong double== )。double

ただし、MinGWには、longdoubleを適切にサポートする一連の代替実装も付属しています。それらを使用するには、関数名の前に__mingw_(eg __mingw_printf)を付けます。プロジェクトの性質によっては、グローバルに使用することも、#define printf __mingw_printf使用することもできます-D__USE_MINGW_ANSI_STDIO(これにより、すべてのファミリー関数のMinGWバージョンが有効になりprintfます)。

于 2013-02-20T19:16:33.270 に答える
18

間違った修飾子に加えて、Windowsへのgccのどのポートですか?mingwはMicrosoftCライブラリを使用しており、このライブラリは80ビット長のdoubleをサポートしていないことを覚えているようです(Microsoft Cコンパイラはさまざまな理由で64ビット長のdoubleを使用します)。

于 2010-11-03T16:35:05.390 に答える
9

この問題でロングダブルをテストしていましたが、残念ながら、修正に遭遇しました。-D__USE_MINGW_ANSI_STDIOを使用してプロジェクトをコンパイルする必要があります。

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ gcc main.c

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe c = 0.00000

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ gcc main.c -D__USE_MINGW_ANSI_STDIO

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe c = 42.000000

コード:

Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test
$ cat main.c
#include <stdio.h>

int main(int argc, char **argv)
{
   long double c=42;

   c/3;

   printf("c=%Lf\n",c);

   return 0;
}
于 2013-03-15T20:19:52.997 に答える
5

C99では、の長さ修飾子はでlong doubleあるように見えますが、そうではLありませんlman fprintf(またはWindowsの場合は同等)特定のプラットフォームについて教えてください。

于 2010-11-03T16:23:23.993 に答える
2

他の回答で述べられているように、正しい変換指定子は"%Lf"です。

gcc呼び出しで-Wformat(または-Wall、を含む)を使用して、フォーマット警告をオンにすることができます。-Wformat

$ gcc source.c
$ gcc -Wall source.c
source.c:関数 `main`内:
source.c:5:警告:フォーマット "%lf"はタイプ `double`を予期していますが、引数2のタイプは` longdouble`です
source.c:5:警告:フォーマット "%le"はタイプ `double`を予期していますが、引数3のタイプは` longdouble`です
$
于 2010-11-03T16:34:58.397 に答える
1

C / C++のprintfおよびscanf関数はMicrosoftCライブラリを使用しており、このライブラリは10バイト長のdoubleをサポートしていません。したがって、C / C ++コードでprintfおよびscanf関数を使用して、long doubleを出力として出力し、一部の入力をlong doubleとして取得すると、常に間違った結果が得られます。

long doubleを使用する場合は、printfおよびscanfの代わりに「__mingw_printf」および「__mingw_scanf」関数を使用する必要があります。10バイト長のdoubleをサポートしています。

または、次のように2つのマクロを定義できます: "#defineprintf__mingw_printf"および"#definescanf __mingw_scanf"

long doubleには標準形式を使用します:%Lf

于 2019-07-27T07:52:59.673 に答える