Неточности с плавающей точкой - PullRequest
1 голос
/ 01 января 2011

При написании функции, которая будет выполнять некоторые операции с каждым числом в диапазоне, я столкнулся с некоторыми проблемами с неточностями с плавающей запятой.Проблема может быть замечена в коде ниже:

#include <iostream>

using namespace std;

int main()
{
    double start = .99999, end = 1.00001, inc = .000001;
    int steps = (end - start) / inc;

    for(int i = 0; i <= steps; ++i)
    {
        cout << (start + (inc * i)) << endl;
    }
}

Проблема состоит в том, что числа, указанные выше, выводятся из программы следующим образом:

0.99999
0.999991
0.999992
0.999993
0.999994
0.999995
0.999996
0.999997
0.999998
0.999999
1
1
1
1
1
1.00001
1.00001
1.00001
1.00001
1.00001
1.00001

Они выглядят корректными только доПервый 1. Как правильно решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 01 января 2011

Ваш пример выходных данных выглядит неправильно из-за того, как ostream округляет по умолчанию. Вы можете установить precision, чтобы получить другой вывод.

cout.precision(10);
cout << (start + (inc * i)) << endl;

Вот что я получаю сейчас:

0.99999
0.999991
0.999992
0.999993
0.999994
0.999995
0.999996
0.999997
0.999998
0.999999
1
1.000001
1.000002
1.000003
1.000004
1.000005
1.000006
1.000007
1.000008
1.000009
1.00001
0 голосов
/ 01 января 2011
...