vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2023-01-14 02:45 pm

За что математики не любят компьютерную арифметику

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

[personal profile] perdakot 2023-01-14 11:56 pm (UTC)(link)
Я хардвер проверя

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

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

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

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

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