20

私は2つのことを指摘しました:

  1. std::numeric_limits<float>::max()+(a small number) 与えます: std::numeric_limits<float>::max() .

  2. std::numeric_limits<float>::max()+(a large numberのように:情報std::numeric_limits<float>::max()/3) を提供します。

この違いはなぜですか?1 または 2 は OVERFLOW になり、未定義の動作になりますか?

編集:これをテストするためのコード:

1.

float d = std::numeric_limits<float>::max();
float q = d + 100;
cout << "q: " << q << endl;

2.

float d = std::numeric_limits<float>::max();
float q = d + (d/3);
cout << "q: " << q << endl;
4

2 に答える 2

1

それはあなたが何をしているかによります。フロート「オーバーフロー」が直接返される式に含まれる場合、つまり

return std::numeric_limits::max() + std::numeric_limits::max();

操作によってオーバーフローが発生しない場合があります。C 標準 [ISO/IEC 9899:2011] から引用します。

return ステートメントは割り当てではありません。セクション 6.5.16.1 のオーバーラップ制限は、関数の戻りの場合には適用されません。浮動小数点値の表現は、型によって暗示されるよりも広い範囲または精度を持つ場合があります。キャストを使用して、この余分な範囲と精度を削除できます。

詳しくはこちらをご覧ください。

于 2013-07-11T08:27:16.733 に答える