質問
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に標準形式を使用します