vak: (Знайка)
[personal profile] vak
#include <stdio.h>
int main ()
{
    if (-5.2 + 4.9 != -0.3) {
        printf("Oops!\n");
    }
    if (4.8 - 6.1 != -1.3) {
        printf("Oops!\n");
    }
    if (4.3 - 3.6 != 0.7) {
        printf("Oops!\n");
    }
}
Это мне надо было простенький тестик сварганить по работе, суммировать плавающие числа, а оно вон как боком выскочило.

nz

Date: 2023-01-14 23:22 (UTC)
From: [personal profile] nz

Зачем так сложно, 0.1 + 0.2 != 0.3 же.

Date: 2023-01-14 23:30 (UTC)
From: [personal profile] ichthuss
Кто использует с плавающими типами сравнения "==" и "!=", кроме очень специальных случаев, тот сам себе злобный буратино.

Тестик, в принципе, относится к этим специальным случаям. Тут можно воспользоваться простым подходом: использовать числа, кратные 1/2^n, где n < 24. Например, 0.25+0.375
Edited Date: 2023-01-14 23:35 (UTC)

Date: 2023-01-15 01:29 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Вечная тема. вообще говоря, вопрос равенства вещественных чисел и теоретически сложен. Проще считать, что это не эквациональная теория.

Date: 2023-01-15 02:07 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Используй шестнадцатеричные вещественные константы типа 0x1p-1. Их уже давно завезли в С и C++.

Date: 2023-01-15 05:53 (UTC)
sobriquet9: (Default)
From: [personal profile] sobriquet9
Есть же DBL_EPSILON и std::numeric_limits::epsilon().

Date: 2023-01-18 11:08 (UTC)
waqur: (Default)
From: [personal profile] waqur
Не зря в банковской сфере так популярен COBOL, у которого развитая система целочисленных типов фиксированной ширины в десятичном представлении. Банкиры ещё в 70-е были не в восторге от всех этих фокусов с округлением вещественных чисел с плавающей точкой.