2013-10-17 9 views
10
int main() 
{ 
     float x = k ; // k is some fixed positive value 
     while(x>0) 
      x-- ; 
     return 0 ; 
} 

上記のプログラムは無限ループできますか?C++のwhileループでの浮動小数点エラー

+0

そうしてはいけません。 – thokra

+0

私はそれが起こるかもしれないいくつかの値があると思います。インタビューの問題でした。私は確信していません。 – Hellboy

+3

@JoachimPileborg C++で定義されていない動作では、これらのタイプの質問をする必要があります。 – Caesar

答えて

14

はいそれが可能です。一例として最大フロートを取る。

このコードは最大フロートmため、図示するように、mm - 1に等しい:

#include <iostream> 
#include <limits> 

int main() { 
    auto m = std::numeric_limits<float>::max(); 
    auto l = m; 
    l--; 
    std::cerr << (m == l) << "\n"; 
} 

デモ:http://ideone.com/Wr9zdN

したがって、この開始値と、ループが無限大となります。

なぜですか?

floatは(他のすべての組み込み型と同様に)限定精度を持っています。 x以外の数でx - 1表現を作るために、xよりも最大数の少ない間の差は2

が今度はm、最大フロートとx、ある最大のフロートとの差を計算させるよりも小さくなければなりません厳密に小さいmより:

#include <iostream> 
#include <cmath> 
#include <limits> 

int main() { 
    auto m = std::numeric_limits<float>::max(); 
    std::cout << "float max: " << m << "\n"; 
    auto x = std::nextafter(m, 0.0f); 
    std::cout << "biggest value less than max: " << x << "\n"; 
    auto d = m - x; 
    std::cout << "the difference: " << d << "\n"; 
} 

デモ:http://ideone.com/VyNgtE

、これら二つの数間2.02824e+31の大きなギャップがあり、判明しました。 1よりもはるかに大きい.1は小さすぎて違いを生むことはできない。

4

実際はできると思います。 kが十分な大きさであれば、丸めはあなたの減少分を奪います。

5

はいできます。 kが例えばFLT_MAXである場合。このような大きな数字の間にこのような小さな距離を処理するのに十分な精度はありません。

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

int main() 
{ 
    float a = FLT_MAX; 
    float b = a - 1; 
    printf("%.10f\n", a - b); 

    return 0; 
} 

出力:

0.0000000000 
+0

あなたは正しいです:) @ [Codepade:of infinite-loop](http://codepad.org/xgn46vst) –

+1

のリンクを追加する違いの出力に依存することは良い考えではありません。そのエラー。平等をチェックしてください。これは、ビット単位の等価性をアサートします。 – stefan

+1

私はそれが期待通りに1ではなかったことを示す良い方法でしたが、0 – detunized

関連する問題