web-dev-qa-db-ja.com

scanfで%f、%e、%g、%E、または%Gを使用することに違いはありますか?

Cで、scanfを使用してfloat変数に読み込むときに使用される形式指定子%f、%e、%g、%E、%Gに違いはありますか?つまり、コードスニペットの動作は

float x;
scanf("%<one of f, e, g, E, G>", &x);

指定子の選択に依存することはありますか?

最初に、%fは10進表記のみを正しく解釈し、%eは科学表記のみを正しく解釈すると想定していましたが、私のシステムでは、どちらの場合もそれぞれ正常に機能します。しかし、おそらく私のシステムはただのリベラルなものです...

私の本やウェブ上でこれについて明確な説明を見つけることができませんでした...

12
lee77

上記の回答はC++について言及していますが、Cについても同様です。

「Corrigenda TC1、TC2、およびTC3が含まれ、ドラフトとしてフォーマットされたC99標準の最終バージョン」の「7.19.6.2 fscanf関数」から (リンクは http: //en.wikipedia.org/wiki/C99 ):

a、e、f、g
オプションの符号付き浮動小数点数、無限大、またはNaNに一致します。その形式は、strtod関数のサブジェクトシーケンスに期待されるものと同じです。対応する引数は、浮動小数点へのポインタです。

変換指定子A、E、F、G、および[〜#〜] x [〜#〜] も有効であり、それぞれa、e、f、g、およびx

そう %f, %e, %g, %E, %Gすべてがscanningの場合、経験したように同じように動作します。

10
Martin R

f,e,gすべては浮動小数点数用です

doc :-から

一連の10進数字。オプションで小数点を含み、オプションで前に符号(+または-)を付け、オプションでeまたはE文字と10進整数(またはstrtodでサポートされるその他のシーケンス)を続けます。 C99に準拠する実装では、先頭に0xまたは0Xが付いている場合、16進浮動小数点形式もサポートされます。

また、これを確認してください 参照 これは、それ(f,e,g)は浮動小数点数に一致します。

2
Rahul Tripathi

Cは、float変数とdouble変数の両方を小数点以下6桁まで表示します。これは、数値が実際に格納される精度(精度)ではなく、これらの変数の型を表示するためにprintf()が使用する小数点以下の桁数のみを指します。

次のプログラムは、さまざまなデータ型がどのように宣言および表示されるかを示しています。

#include <stdio.h>

main()
{

    float   a = 23.567;
    double  b = 11e+23;

    printf("Float variable is %f\n", a);
    printf("Double variable is %e\n", b);
}

出力

Float variable is 23.567000
Double variable is 11.000000e23
1
Keshav Bansal

%f:対応する数値を10進浮動小数点数として出力します。 214.52

%e:科学表記法で数値を出力します。 214.52e + 2。

%g:対応する数値を2つの中で最短で出力します。上記の2つの例で、%gを使用して数値を出力したい場合、214.52になりますが、2.145e + 2は長くなります。

#include<stdio.h>
void main()
{

float f=12.5;

    printf("%f\n",f);
    printf("%e\n",f);
    printf("%g\n",f);
}

出力:

12.500000

1.250000e + 001

12.5

0
Sameer Sharma

@Sameer Sharmaの回答に基づく

$ cat test.c 
#include<stdio.h>
void main()
{

float f=12.5123;

    printf("%f\n",f);
    printf("%e\n",f);
    printf("%g\n",f);
}

$ gcc test.c
$ ./a.out
12.512300
1.251230e+01
12.5123
0
hukeping