Округление при подсчёте в С++?

Почему в столбце Х, при подсчёте не округляется до меньшего значения и не выводит 1 в 21 шаге? Как можно исправить это?

65b9fd10ab337372202292.png

#include <iostream>
#include <cmath>
#include <iomanip>
#include <string>

float calculateExpression(float x) {
    float result = 0;
    result = log(abs(95 / 10) + 4) * (1 - 95 / cos(x - 95)) * (sin(x) / 95);
    if (cos(x - 95) == 0 && sin(x) / 95 == 0 && log(abs(95 / 10) + 4) * (1 - 95 / cos(x - 95)) * (sin(x) / 95) < 0) {
        std::string str = std::to_string(result);
        std::cout << "Error" << std::setprecision(6) << std::fixed << result  << std::endl;
    }
    int resultX = floor(result);
    return resultX;
}

void printTable(float startX, float endX, float step) {
    std::cout << std::right << std::string(10, ' ') << std::string(65, '-') << std::endl;
    std::cout << std::right << std::setw(10) << "|" << " N " << std::right << std::setw(9) << " | " << std::right << std::setw(10) << std::right << std::setw(10)
        << " X " << std::right << std::setw(15) << " | " << std::right << std::setw(20) << " Expression " << std::right << std::setw(10) << " | " << std::endl;
    std::cout << std::right << std::string(10, ' ') << std::string(65, '-') << std::endl;
    int rowNum = 1;
    float x = startX;
    while (x <= endX) {
        float expressionValue = calculateExpression(x);
        std::cout << std::right << std::setw(10) << "|" << std::right << std::setw(3) << rowNum << std::right << std::setw(8) << "|" << std::right << std::setw(15) 
            << std::setprecision(6) << x << std::right << std::setw(10) << "|" << std::right << std::setw(10) << std::fixed << std::setprecision(6) << expressionValue
            << std::right << std::setw(20) << "|" << std::endl;
        rowNum++;
        if (step > 0) {
            x += step;
        }
        else {
            x -= step;
        }
        std::cout << std::right << std::string(10, ' ') << std::string(65, '-') << std::endl;
    }
}

int main() {
    float startX = 0, endX = 0, step = 0;
    std::cout << __cplusplus << std::endl;              // Версия С++
    std::cout << "Initial value for X: ";
    std::cin >> std::fixed >> std::setprecision(6) >> startX;
    std::cout << "Final value for X: ";
    std::cin >> std::fixed >> std::setprecision(6) >> endX;
    do {
        std::cout << "Variable change step deltaX: ";
        std::cin >> step;
    } while (step == 0);
    printTable(startX, endX, step);
    return 0;
}
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что 0.1 в двоичном коде не представимо конечным числом.
0.110 = 0.0(0011)2
Записывая это число в 32-битовый float вы получаете 1.100110011001100110011012 * 2-4 или 0.10000000149011611938476562510
Соответственно, когда вы 20 раз прибавляете 0.1 к -1, вы не получаете 1. Вы получаете 1.00000029802322387695312510.
Это число, очевидно, больше единицы, поэтому условие цикла не срабатывает и 21я строка не выводится.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы