Форум программистов, компьютерный форум CyberForum.ru

Как работает сравнение float/double (IEEE 754) - C++

Восстановить пароль Регистрация
 
xaser
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 1
27.11.2014, 18:16     Как работает сравнение float/double (IEEE 754) #1
Возможно нубский вопрос.
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    double a, b, x, res;
    bool f;
    a = 0.5;
    b = 0.3;
    res = a + b;
    x = 0.8;
    f = res == x;
    return 0;
}
Т.е тупо сравниваем сравниваем результат сложения 0.3+0.5 и 0.8

Вот так VS2013 показывает предствление всех переменных.

Посмотрел в этой программе точное представление и вот что увидел (после дефиса - число, восстановленное из double):
0.5 - 0.5
0.3 - 0,299999999999999988897769753748434595763683319091796875
0.8 - 0,8000000000000000444089209850062616169452667236328125

т.е сумма должна давать 0.799999999999999988897769753748434595763683319091796875

Вопрос - как получилось, что f и res равны 0.80000000000000004 ?

Добавлено через 3 часа 19 минут
Туплю...
Если положить 0.799999999999999988897769753748434595763683319091796875 в double, то как раз получится ~0.80000000000000004

Добавлено через 6 минут
Другой вопрос:
почему выводится 17 знаков после запятой? Тут написано, что точность 15.9 знаков, т.е 16 должно хватать в любом случае?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 18:16     Как работает сравнение float/double (IEEE 754)
Посмотрите здесь:

Как именно округляются float и double? C++
Visual C++ как сменить тип с int на double или float в MFC c++
C++ как победить Double? Float?
Неправильно работает cout для чисел типа double и float C++
C++ IEEE 754 абсолютная ошибка
Почему точность Double такая же как у Float ? C++
C++ Как сделать в конструкциий switch, чтобы он считал норм float и double
C++ Ошибка с циклом While. По разному работает с double и float, хотя должен бы одинаково
C++ Как проверить вводилось ли число (типа double или float) в консоль
C++ Как мне программу с int переделать в Float i double?
C++ Число 65,41 представлено у форматі чисел із плаваючою крапкою стандарту IEEE 754 з одинарною точністю
Значение double, float как можно разложить на байты C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 00:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru