Вот вычитаниемIEEE754 поплавок точка точность теряется вычитание
Первый номер
Decimal 3.0000002
Hexadecimal 0x4040001
Binary: Sign[0], Exponent[1000_0000], Mantissa[100_0000_0000_0000_0000_0001]
второй номер вычесть:
Decimal 3.000000
Hexadecimal 0x4040000
Binary: Sign[0], Exponent[1000_0000], Mantissa[100_0000_0000_0000_0000_0000]
============= =============================
в этой ситуации показатель уже же, нам просто нужно вычитать мантиссы , В IEEE754 мы знаем, что перед мантиссой есть укрытие 1. Таким образом, результат мантисса должна быть:
Mantissa_1[1100_0000_0000_0000_0000_0001] - Mantissa_2[1100_0000_0000_0000_0000_0000]
который равен
Mantissa_Rst = [0000_0000_0000_0000_0000_0001]
Но это число не нормируется, из-за первый тайник бит не равен 1. Таким образом, мы сдвигать Mantissa_Rst право 23 раза , и экспоненциальные минусы 23 одновременно.
Тогда мы имеем значение результата Всего
Hexadecimal 0x4040000
Binary: Sign[0], Exponent[0110_1000], Mantissa[000_0000_0000_0000_0000_0000].
32 бит, без округления необходимо.
Обратите внимание, что в регионе мантиссы, есть еще скрытый 1.
Если мои расчеты верны, то преобразование результат в десятичном числе +0,00000023841858, по сравнению с реальным результатом 0,0000002, я до сих пор считаю, что это не очень точный.
Итак, вопрос в том, что мои расчеты ошибочны? или на самом деле это реальная ситуация и происходит все время в компьютере?
Десятичное число '3.0000002' не может быть точно представлено в базе 2, оно будет округлено до ближайшего представимого числа. Преобразуйте его в двойную точность и выведите больше цифр, вы увидите, что я имею в виду. –
Это происходит постоянно на компьютере. если вы хотите это увидеть. Попробуйте вычислить (1/3 + 1/3 +1/3) == 1. потому что это может быть точно 0,0000002 с 23 для мантиса и 8 для экспонента – Alon
Если вы считаете, что это плохо, поймите, что это _benign_ аннулирование. Существует аналогичная проблема, известная как _catastrophic_ аннулирование. – MSalters