Другие языки программирования и технологии

Почему Delphi XE7 неправильно считает

var a,b,c:real;
begin
a:=4,8;
b:=4,8;
c:=a-b;
showmessage(FloatToStr(c));
end;

ответ показывает 4,44089209850063E-15
Во-первых, 8/10 нельзя представить в конечном двоичном виде, так же как в десятичной системе нельзя представить в конечном виде, скажем 1/3. Поэтому в памяти хранится только некоторая часть этой дроби.

Во-вторых, операции вычитания как таковой для компьютера не существует. Для осуществления вычитания число сначала делается отрицательным, а затем осуществляется сложение. При переводе 8/10 в отрицательное его точность тоже снижается (а оно у нас и так не было точным).

Таким образом при сложении образуется разница в 1-2 бита из 64, в которых хранится число с плавающей точкой - это и есть твоя погрешность. Она неизбежна, и никакие умножения и деления (кстати, если уж на то пошло, множить надо не на степени 10-ки, а на степени 2-ки) тебя не спасут. А спасет тебя знание математики: если, блин, у тебя исходная точность данных - 1 знак после запятой, то нет никакого математического смысла в выводе данных с более чем 1 знаком после запятой. Вот и округляй до 1 знака.
SK
Sunatullo Kurbonov
63 140
Лучший ответ
Дима Бодров точность 3 знака
применил

uses Math
...
c:=RoudTo(a-b,-3);
Слава Конюхов Действительно интересно
Какое бы ни было округление. если взять две ОДИНАКОВЫХ константы, при вычитании должно получаться 0
Почему в две переменные пишутся разные числа?
Я понимаю что 4.8-2.4-2.4 не факт, что получится 0, но почему 4.8-4.8 не 0?
Слава Конюхов 4.8 -> IEEE754 = 0x4099999a = 4.80000019073486328125
a=4.80000019073486328125
b=4.80000019073486328125
a-b=4.80000019073486328125-4.80000019073486328125=0 !
Это как у тебя вообще схавало? a:=4,8; ЗАПЯТАЯ вместо точки
Дима Бодров не схавало. это я так здесь написал на скорую руку (не копировал код из delphi)

знаю только что
a:real; // a=4.8 (с точкой)
b:string; // b='4,8' (с запятой)
Так правильно, в чём проблема-то?
Это из-за чисел с плавающей точкой незначительная погрешность
Дима Бодров ответ должен быть 0
Виталий Озерной Кстати, вот поэтому в компьютере применяются отдельно целые и вещественные типы представления чисел. И отчасти из-за этого программирование не стоит преподавать в школах - слишком много в нем тонкостей, не зная которых, можно получить ошибочные результаты.
если число 0,0000000000000000000444 тебя сильно напрягает, то выводи на экран в округленном виде. дельфи считает верно, а твои проблемы от непонимания представления числа с плавающей запятой.
Y S
Y S
22 439