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

Почему мой код увеличивается до 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
}

Спасибо!

2

Решение

Старые добрые ошибки с плавающей запятой, распечатайте с высокой точностью 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 ) {
...

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

0

Другие решения

Других решений пока нет …