4

一部の値はfloatで簡単に定義できず、「近似」されているだけなので、直接の「等しい」比較は頻繁に機能しません。

std :: neuro_limits :: maxをfloatに正確に格納できますか?このコードは期待どおりに機能しますか?

float myFloat = std::numeric_limits<float>::max();

//...later...
if(myFloat == std::numeric_limits<float>::max())
{
    //...myFloat hasn't changed...
}
4

3 に答える 3

4

はい。

数値制限はクラステンプレートであり、maxは静的メソッドです。

  template <class T> class numeric_limits {
  public:
  ...
  static T max() throw(); //constexpr if using C++11
  ...
  };

したがって、floatタイプの場合、実際にstd::numeric_limits<float>::max()は同じ値の2つのfloatを使用して単純に比較します(比較前にmyFloatを操作していない場合)。max()の値は、プラットフォームの一貫したfloatになり、それ自体と同等のバイナリ表現になります。

あなたが抱える主な問題は、異なる浮動小数点バイナリ表現を使用してプラットフォーム間でシリアル化および逆シリアル化しようとすることです。したがって、myFloat変数をシリアル化しようとした場合、他のマシンで、逆シリアル化された値の結果をnumeric_limits :: max()と直接比較しようとします。

if( myFloat == std::numeric_limits<float>::max() )

結果はもはや当てはまらないかもしれません。次に、「MAX」の概念をバイナリ表現でエンコードし、希望どおりに明示的に解釈する必要があります。

于 2013-02-25T00:21:51.553 に答える
4

与えられた(非NaN)float変数に対して、は常に真fであることが保証されます。ある値に設定されるf == fので、もちろんそれは同じ値と等しく比較されます。myFloatfloat

あなたはどうやら次のようなケースを考えています:

float f1 = 0.1;
float f2 = 1.0/10;
assert( f1 == f2 );

これは失敗する可能性がありますが、失敗することはありません。

float f1 = 0.1;
float f2 = 0.1;
assert( f1 == f2 );

変数に格納されている値は正確に等しくない場合0.1がありますが、代わりに異なる値を持つ場合がありますが、両方の変数で同じ値が得られるため、それらは等しく比較されます。

返される値が何であれnumeric_limits<float>::max()、それはそれ自体と同等に比較される固定値です。

于 2013-02-25T01:01:49.040 に答える
2

はい、でも

myFloat += someSmallFloat;

の値を変更することはできませんmyFloat

さらに理解したい場合は、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことと呼ばれる浮動小数点表現に関する優れたチュートリアルがあります。

于 2013-02-24T23:46:54.100 に答える