13
#include <stdio.h>
#include <float.h>

int main()
{
    printf("%f\n", FLT_MAX);
}

GNU からの出力:

340282346638528859811704183484516925440.000000

Visual Studio からの出力:

340282346638528860000000000000000000000.000000

C および C++ 標準では両方の結果が許可されますか? それとも、特定の結果を義務付けていますか?

注意してくださいFLT_MAX = 2^128-2^104 = 340282346638528859811704183484516925440

4

3 に答える 3

6

C99 標準の関連部分は、7.19.6.1 p.13 の「推奨される方法」だと思います。

、、、、、および変換の場合e、 10 進数の有効桁数が最大 でも である場合、結果は正しく丸められます。10 進数の有効桁数が を超えていても、ソース値が数字で正確に表現できる場合、結果は末尾のゼロを含む正確な表現になるはずです。それ以外の場合、ソース値は 2 つの隣接する 10 進文字列L < Uによって制限され、どちらも有効数字を持ちます。結果の 10 進文字列Dの値は、 L <= D <= Uを満たす必要がありますEfFgGDECIMAL_DIGDECIMAL_DIGDECIMAL_DIGDECIMAL_DIG、エラーが現在の丸め方向に対して正しい符号を持つ必要があるという追加の規定があります。

私の印象では、これにより、この場合に印刷される可能性のあるものにある程度の余裕ができます。私の結論は、VS と GCC の両方がここで準拠しているということです。

于 2012-06-10T17:04:52.193 に答える
1

どちらも C 標準で許可されています (C++ は C 標準をインポートするだけです)。

セクション 5.2.4.2.2 パート 10のドラフト バージョンから

次のリストに示す値は、表示されている値以上の実装定義の値を持つ定数式に置き換えられます。
— 表現可能な最大の有限浮動小数点数 (1 − b −p)b emax

FLT_MAX 1E+37

Visual C++ 2012 には

#define FLT_MAX         3.402823466e+38F        /* max value */
于 2012-06-10T17:11:38.700 に答える
0

または%fに保持されている有効値よりも大きな値を使用する場合、コード自体に欠陥があります。そうすることで、10 進数への変換で生成される無意味なガード ビットやその他の浮動小数点ノイズについて、「舞台裏」を確認するよう求めています。floatdouble

明らかに、ホンダとトヨタでエンジンを製造した後に生成される金属の削りくずに一貫性があると期待するべきではありません。そのような一貫性に対する賢明な期待は気にしないでください。

%gこのような数値を表示する適切な方法は、指定された精度が過度に指定されていないなどの「科学的」形式のいずれかを使用することです。IEEE-754 実装では、 では 7 桁、 では 15 ~ 16 桁、 では約 19 桁、 では 34 桁floatdouble有効long doubleです__float128。したがって、%.15gIEEE-754 実装上にあると仮定すると、あなたが示した例は適切です。

于 2012-06-10T17:23:58.453 に答える