Entry tags:
За что математики не любят компьютерную арифметику
#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"); } }Это мне надо было простенький тестик сварганить по работе, суммировать плавающие числа, а оно вон как боком выскочило.
no subject
Да, я ровно к тому и пришёл: использовать только рациональные числа со знаменателем - степенем двойки.
no subject
Тогда, наверное, надо float раздербанить на знак, экспоненту и мантиссу (целые) и сравнивать их, а не плавучку.
no subject
Проблема в том, что большинство десятичных дробей не могут быть точно отображены в двоичное представление. Получаются бесконечные дроби, к примеру:
десятичное 0.1 = двоичное 0.0001100110011(0011)
Бесконечную двоичную дробь приходится укорачивать. Возникает погрешность.
no subject
Не может быть, что копиляторы могут сделать мантиссу немного разную у плавучего литерала?
no subject
no subject
https://www.exploringbinary.com/double-rounding-errors-in-floating-point-conversions/
И ещё рядышком:
https://www.exploringbinary.com/incorrectly-rounded-conversions-in-visual-c-plus-plus/
no subject
Там про десятичную печать, но алгоритм можно применить и для сравнения.