Тема: От чего возникает погрешность при вычитании?

Ни кто случайно не знает, ниже приведённая ошибка является
ошибкой процессора или чем то ещё.
Ошибка хоть и в 10-м знаке, но не в простом же вычитании, с
2-мя знаками после запятой. Если бы деление или тригонометрия,
тогда можно понять.
Сталкиваюсь с ней уже не раз, причём не зависимо от языка программирования.
По крайней мере на Delphi результат тот же. Заметил ещё на Pentium Pro,
на II и IV ситуация таже, правда все они на процессорах Intel.
Значения мугут быть разные, но прослеживается некая закономерность.
Была даже ошибка при разности двух целых вещественных чисел.

Sub test()
   Pl = 5450009.51 - 5450010.35     ‘ результат = -0.839999999850988
   P2 = 9.51 - 10.35                ' результат = -0.84
   P3 = 5450010.35 - 5450009.51     ‘ результат = 0.839999999850988
   P4 = 10.35 - 9.51                ‘ результат = 0.84
End Sub

Re: От чего возникает погрешность при вычитании?

> Dron
Переводи:
Microsoft Office 2000/Visual
Basic Programmer's Guide.
The Floating-Point Data Types
VBA provides two floating-point data types, Single and Double. The
Single data type requires 4 bytes of memory and can store negative
values between -3.402823 x 1038 and -1.401298 x 10-45 and positive
values between 1.401298 x 10-45 and 3.402823 x 1038. The Double data
type requires 8 bytes of memory and can store negative values
between -1.79769313486232 x 10308 and -4.94065645841247 x 10-324 and
positive values between 4.94065645841247 x 10-324 and
1.79769313486232 x 10308.
The Single and Double data types are very precise-that is, they
allow you to specify extremely small or large numbers. However,
these data types are not very accurate because they use
floating-point mathematics. Floating-point mathematics has an
inherent limitation in that it uses binary digits to represent
decimals. Not all the numbers within the range available to the
Single or Double data type can be represented exactly in binary
form, so they are rounded. Also, some numbers can't be represented
exactly with any finite number of digits-pi, for example, or the
decimal resulting from 1/3.
Because of these limitations to floating-point mathematics, you may
encounter rounding errors when you perform operations on
floating-point numbers. Compared to the size of the value you're
working with, the rounding error will be very small. If you don't
require absolute accuracy and can afford relatively small rounding
errors, the floating-point data types are ideal for representing
very small or very large values. On the other hand, if your values
must be accurate-for example, if you're working with money
values-you should consider one of the scaled integer data types.
Успехов
~'J'~

Re: От чего возникает погрешность при вычитании?

Другими словами, вычитая из одного целого вещественного числа типа Double
другое целое вещественное, очень часто будет получаться дробное число?
Но в описание формата сказано, что данная ошибка очень маленькая приблизительно 1/3.
А в приведённом примере она в 10-м знаке, хотя точность типа Double 15-16 знаков.
В Delphi тип Extended 19-20 знаков, но результат тотже.
Может в работе компьютеров я мало что понимаю, но зачем тогда все эти точности.
Был раньше один вещественный тип Real 11-12 знаков, всегда округляли до 10-го знака,
и не было проблем, кроме проблемы количества значащих цифр. А теперь куча
новых типов с огромным количеством знаков, а результат на прежнем уровне?
Но если в своих программах, эту проблему ещё можно как-то обойти, то в тех же
AutoCAD, MicroStation с этим серьёзная проблема.
Например:
- В MicroStation ставишь блок под углом 0, а в результате данной ошибки,
все углы разворота в ней отличны от нуля.
- В AutoCAD создаёшь видовые окна с целыми значениями высоты и ширины, а
в результате данной ошибки, они часто становятся дробными, в результате
программы выдают ошибку и отказываются с ними работать. А например в
геодезии значения рамок планшетов обязаны быть однозначно целыми. Если при
выводе на принтер этим можно пожертвовать, из-за его точности, то при обсчёте
стыковок планшетов и сводке информации возникает серьёзная проблема.
Получается, что старые добрые счёты с Феликсами работают намного точнее
самых современных компьютеров. В своё время в нашем институте, когда появились
первые микрокалькуляторы, старые професора всегда проверяли их результаты
на тех же Феликсах. Видимо с тех пор в точной математике так ни чего и не изменилось?

Re: От чего возникает погрешность при вычитании?

Нашёл описание форматов вещественых типов IEEE, из него вовсе не следует данная ошибка.
Поигрался с разными числами в VBA и Delphi, результат получил довольно странный.
Delphi перестал давать данную ошибку и в типе Double и в типе Extended, хотя до этого давал стабильно.
VBA даёт ошибку стабильно, причём от количества значащих цифр она не зависит, исчезает только когда
перед запятой остаётся два знака. Чаще всего возникает, когда количество знаков, в обоих значениях,
одинакого, реже если разное.
Что-то не верится, что подобная ошибка изначально была заложена в вещественный формат, больше похоже на
ошибку VBA, либо процессора. Тем более, что точность Double 15 знаков, а значения в примере имеют
только 9, даже если их уменьшить до 6, только увеличится количество девяток.

Re: От чего возникает погрешность при вычитании?

> Dron
Не понимаю в чем проблема в данном случае. Округляй получаемые значения до целого. И сравнение значений производи не на равенство, а на попадание в диапазон (например, 1e-6).