検討
float num;
cin >> num;
このコードが消費できる入力の文字数は明確に定義されていますか? num
入力ストリームが、型が表現できる精度よりもはるかに高い精度で指定されている可能性がある場合に特に興味がありますfloat
。したがって、この場合、コードがすべて (次の非数値入力まで) を読み取るか、または の最大精度までだけを読み取るかは標準化されていますfloat
。
検討
float num;
cin >> num;
このコードが消費できる入力の文字数は明確に定義されていますか? num
入力ストリームが、型が表現できる精度よりもはるかに高い精度で指定されている可能性がある場合に特に興味がありますfloat
。したがって、この場合、コードがすべて (次の非数値入力まで) を読み取るか、または の最大精度までだけを読み取るかは標準化されていますfloat
。
入力は std::num_get 22.4.2.1.2 で定義されています。
ステージ 3: ステージ 2 (フィールド) で蓄積された一連の文字は、ヘッダーで宣言された関数のいずれかのルールによって数値に変換されます。
— 符号付き整数値の場合、関数 strtoll。
— 符号なし整数値の場合、関数 strtoull。
— 浮動小数点値の場合、関数 strtold。
格納される数値は、次のいずれかです。
— 変換関数がフィールド全体の変換に失敗した場合はゼロ。ios_base::failbit は err に割り当てられます。
— フィールドが val で表現するには大きすぎる正の値を表す場合、最も正の表現可能な値。ios_base::failbit は err に割り当てられます。
— フィールドが val で表現するには大きすぎる負の値を表す場合は、最も負の表現可能な値または符号なし整数型のゼロ。ios_base::failbit は err に割り当てられます。
したがって、ストリームはすべての有効な数値パターンを (オーバーフロー後でも) 消費し、それに応じて状態が設定されます。
std::istream::operator>> docsの「(1) 算術型」に関する情報を参照してください。これはnum_get::get()
、「1つの文字が有効な数値式の一部でなくなるとすぐに、関数はシーケンスからの文字の読み取りを停止します」と述べているドキュメントの関連部分を使用します。
そのため、ドキュメントから、利用可能なすべての数字が読み取られるように見えますが、float 型が「狭い」場合、すべてが使用されるわけではありません。