С ++ Эйлерово приближение

Почему мой код увеличивается до 2,4 для значения x в качестве выходного сигнала, когда я ввожу 0,1 в качестве размера шага? Если я ввожу значение, например 0,01 или 0,001, оно увеличивается до 2,5.

#include <iostream>
#include <iomanip>
using namespace std; 
int main() {
    double step; 
    double x0 = 1.0; 
    double y0 = 1.0; 
    double diffY; 
    std::cout << std::fixed;
    std::cout << std::setprecision(2);
    cout << "Enter step value: ";
    cin >> step; 
    while (x0 <= 2.5 ) {

        diffY = x0 + ((3*y0) / x0);
        cout << x0 << "    " << y0 << "\n"; 
        x0+=step;
        y0+=step*(diffY);
    }

    return 0; //initially defined the main function to return an int
} 

Спасибо!

1 ответ

Старые добрые ошибки с плавающей запятой, распечатайте с высокой точностью x0, вы получите это:

1.1000000000000001
1.2000000000000002
...
2.4000000000000012
2.5000000000000013

Обратите внимание на то, как в вашем последнем прошлом вы будете увеличивать на 2,5, поэтому не будете выполнять последний цикл. Это связано с тем, что числа с плавающей запятой являются двоичными (основание 2), а не десятичными (основание 10), поэтому они не могут точно представлять каждое число. Это включает 0.1,

Вы должны всегда использовать эпсилон при сравнении чисел с плавающей запятой:

float eps = step/100; // Only an example.
while (x0 <= 2.5 + eps ) {
    ...

Для получения дополнительной информации, прочитайте это. Если вы хотите играть, вот живой пример.

Другие вопросы по тегам