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");
    }
}
Это мне надо было простенький тестик сварганить по работе, суммировать плавающие числа, а оно вон как боком выскочило.

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-14 23:56 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
Я хардвер проверя

Тогда, наверное, надо float раздербанить на знак, экспоненту и мантиссу (целые) и сравнивать их, а не плавучку.

Date: 2023-01-15 01:19 (UTC)
perdakot: (Default)
From: [personal profile] perdakot
Это без разницы, сравнивать три поля по отдельности или всё слово целиком.

Не может быть, что копиляторы могут сделать мантиссу немного разную у плавучего литерала?

Date: 2023-01-15 00:47 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
Есть полезная статья G. Steele, Jon L. White - How to print floating-point numbers accurately

Там про десятичную печать, но алгоритм можно применить и для сравнения.