C++ компилятор не читает дробные числа [дубликат]

347
17 октября 2017, 03:27

На данный вопрос уже ответили:

  • Вычисления на числах с плавающей точкой не работают 1 ответ

Я начинающий в с++. Решал задачи на операторах if else Есть 2 математических задач. 1-ую выводит. а 2-нет.

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
    float x;
    cout << "y=";
    cin >> x;
    if (x>2.3)
    {
        cout << (2.7 + (-0.27))*((2 * 2.7 - 3 * (-0.27)) + 1) << '\n';
    }
    if (x >= 2.3) {
        cout << exp(6.21) + sin(6.21)<<'\n';// Тут выбран 2.3  
    }
    system("pause");
    return 0;
}

В-общем когда ввожу в stdin значение 3 выводит ответ на 1 операцию = 17.520320.... а когда ввожу 2.3 выводит только y= . В чем я ошибся?

Answer 1

Ну не умеет компьютер представлять числа с плавающей точкой абсолютно точно!

Ваше 2.3 внутри превращается в 2.2999999523162841797... Потом преобразуется для сравнения в double, ну, а константа 2.3, написанная вами в программе, имея тип double, уже равна 2.2999999999999998224, т.е. больше введенного вами значения...

Вот если вы напишете doble x, то тогда ваше 2.3 превратится в то же представление, что и литерал 2.3 в программе, и равенство сработает.

Но в общем случае сравнивать на равенство числа с плавающей точкой - занятие нездоровое.

READ ALSO
Стоит ли заменить подход std:thread на std::async?

Стоит ли заменить подход std:thread на std::async?

В проекте (многоагентная система для работы с потоком разнотиповых данных в реальном времени) используется многопоточность из стандартной...

250
Как считать массив из файла?

Как считать массив из файла?

Программа должна считывать массив из файла и искать в нём минимальный элемент, но что-то не получается нормально считать сам массивВ чем...

545
Пароль через CreateFile для PhysicalDrive1

Пароль через CreateFile для PhysicalDrive1

Возможно ли через функцию CreateFile установить пароль на PhysicalDrive1, те

229
Вершинное покрытие

Вершинное покрытие

Задача состоит в том, что нужно найти в графе размера N(кол-во вершин) вершинное покрытие размера KАлгоритм работает следующим образом:

328