質問

WindowsにNetBeanを備えた最新の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 ...
役に立ちましたか?

解決

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

他のヒント

Printf ManPageから:

L(ELL)次の整数変換は、長いintまたは符号なしの長いint引数に対応するか、次のn変換は長いint引数へのポインターに対応します。 wchar_t引数へのポインターに対応します。

A、A、E、E、F、F、G、またはGの変換に続くLAは、長い二重引数に対応します。 (C99は%LFを許可しますが、SUSV2は許可しません。)

あなたが望んでいるのは %Le 、 いいえ %le

編集:さらなる調査では、MINGWがMSVC/Win32ランタイム(PrintFのようなものの場合)を使用していることを示しているようです。したがって、ネイティブのロングダブルを提供するコンパイラ(GCCなど)を混ぜて、めちゃくちゃに見えないランタイムとの装備を提供します。

はい - のため long double, 、使用する必要があります %Lf (すなわち、上ケース「L」)。

MINGWを使用している場合、問題はデフォルトでMINGWがI/O RESPを使用していることです。 Microsoft Cランタイムからのフォーマット関数は、80ビットの浮動ポイント番号をサポートしていません(long double == double Microsoft Land)。

ただし、Mingwには、その代替実装のセットも付属しています。 行う 長いダブルスを適切にサポートします。それらを使用するには、関数名に接頭辞を付けます __mingw_ (例えば __mingw_printf)。あなたのプロジェクトの性質によっては、あなたもグローバルにしたいかもしれません #define printf __mingw_printf または使用します -D__USE_MINGW_ANSI_STDIO (これにより、すべてのMINGWバージョンが可能になります printf- ファミリー機能)。

この問題に長いダブルスをテストしていたので、悲しいかな、私は修正に出会いました! -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.000000

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;
}

C99では、の長さ修飾子 long double と思われる L そしてそうではありません l. man fprintf (またはWindowsに相当する)特定のプラットフォームについては教えてください。

他の回答で言われているように、正しい変換指定子は "%Lf".

使用してフォーマット警告をオンにすることをお勧めします -Wformat (また -Wall, 、それを含む -Wformat)GCCの呼び出し

$ gcc source.c
$ gcc -Wall source.c
source.c: In function `main`:
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double`
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double`
$

C/C ++のprintfおよびscanf関数はMicrosoft Cライブラリを使用し、このライブラリは10バイトの長いダブルをサポートしていません。したがって、c/c ++コードでprintfおよびscanf関数を使用して、出力として長いダブルを印刷し、長いダブルとして何らかの入力を取得する場合、常に間違った結果が得られます。

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

または、このような2つのマクロを定義することができます: "#define printf __mingw_printf"および "#define scanf __mingw_scanf"

Long Double:%LFに標準形式を使用します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top