2

double を使用してループの終了を制御しているため、これは丸め誤差と関係があるのではないかと思いますが、実際に何が起こっているのか知りたいです。

#include<iostream>

using namespace std;

int main()
{
  double h = 0.2;  // stepsize                                                                                                                                                                       
  double t_0 = 1;
  double t_n = 25;
  double y_0 = 1;  // initial condition                                                                                                                                                              


  double t = t_0;
  while(t < t_n)
    {
      cout << "t: " << t << endl;
      cout << "(t < t_n): " << (t < t_n) << endl;
      t += h;
    }
}

出力の最後の数行は

t: 24.4
(t < t_n): 1
t: 24.6
(t < t_n): 1
t: 24.8
(t < t_n): 1
t: 25
(t < t_n): 1

最後のステートメントは false を返すべきではありませんか? つまり、ループは @ 24.8 で終了すべきではありませんか?

4

4 に答える 4

3

そうですdouble、正確なタイプではなく、正確な結果を期待することはできません。(典型的な例は、0.1 + 0.1 + 0.1 が 0.3 と同じではないということです。それよりも大きい場合も小さい場合もあります。) 可能であれば、固定小数点の積分演算を優先します。

for (int i = 10; i < 250; i += 2)
{
    double t = i / 10.0;
    std::cout << "t: " << t << "\n";
}
于 2013-04-28T21:05:58.977 に答える
0

ループ内で float キャストを使用して double を使用するか、カスタム < 演算子を使用して独自の double 型をインスタンス化できます。

#include <iostream>

using namespace std;



class _double
{
    private :
    double d ;

    public :
    _double(double d) { this->d = d ;}
    double get() { return d ;}

_double &operator+=(_double  &a)
    {
        this->d+=a.get();
        return *this;
    }

void display(ostream &out)
    {
    cout << this->d ;
    }
};

bool operator<(_double  &a,_double  &b)
    {
        if ( (float ) a.get() <  (float) b.get()  )
        return true ;
        return false ;
    }



ostream& operator<<(ostream& out, _double & a)
{
    a.display(out) ;
    return out;
}

int main()
{
  double h = 0.2;  // stepsize
  double t_0 = 24;
  int  t_n = 25.;
  double y_0 = 1;  // initial condition

    _double d1(25);
    _double d_t(24);
    _double d_h(0.2);


 cout <<  endl << " =========== First Method ============== " << endl   ;


   double t = t_0;
   while((float) t<(float) t_n)
    {
      cout << "t: " << t<< endl;
      cout << "(t < t_n): " << (t < t_n) << endl;
      t += 0.2;
    }


    cout << " out of loop t: " << t << endl;
    cout << "out of loop ->  (t < t_n): " << (t < t_n) << endl;

     cout << " =========== Second Method ============== " << endl ;


      while( d_t< d1)
    {
      cout << "t: " << d_t<< endl;
      cout << "(t < t_n): " << (d_t < d1) << endl;
      d_t += d_h;
    }



    cout << "out of loop t: " << t << endl;
    cout << "out of loop ->  (t < t_n): " << (t < t_n) << endl;
    return 0;

}
于 2013-04-28T21:56:01.180 に答える