c++ Перебор чисел с плавающей точкой

Нужно узнать какие числа составляет число N из чисел a и b

к a и b должно с помощью цикла прибавлятся по 0.1 Делал что то типо такого:

double P, R;

cin >> P;
cin >> R;

for (double i = 0.1; i <= P; i = i + 0.1) {
    for (double j = 0.1; j <= P; j = j + 0.1) {
        double s = i + j;
        if (s == P) {
            cout << i << " " << j << endl;
        }
    }
}
cout << "END" << endl;

Но так как у числа не просто 0.1 а 0.1000000000...56 из за этого число переходит и не находит все цифры которые могут получится при сложении этих двух, особенно обычных напрмер для 13 (7 и 6)


Ответы (1 шт):

Автор решения: Zhihar

во-первых double сравнивать можете так:

abs(s - P) < 0.0001

где 0.0001 - это заданная для вашей задачи точность, написал от балды, можно поставить что-то типа 1e-10

во-вторых, чтобы точность проседала меньше, лучше не накапливать ошибку через сложение double чисел, а

  1. сделать цикл по целым числам

     for (int i = 0; i < int(P / 0.1) + 1;  i ++)
    
  2. вычислять конкретный double для конкретного i

     const value_i = 0.1 * i;
    
→ Ссылка