C Аппроксимация Эйлера

#c #approximation

#c #аппроксимация

Вопрос:

Почему мой код увеличивается только до 2.4 для значения x в качестве выходных данных, когда я ввожу 0.1 в качестве размера шага? Если я ввожу значение типа .01 или .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. Вы должны выполнять цикл, используя ограничения на основе целых чисел, а внутри цикла уменьшать значения. В противном случае ваш цикл может выполняться разное количество раз в зависимости от компилятора, параметров компилятора и т. Д.

Ответ №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 ) {
    ...
  

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

Комментарии:

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

2. Я предлагаю вообще не использовать циклические счетчики циклов с плавающей запятой. Всеми правдами и неправдами сделайте эти значения ограничений цикла целыми.