Аппроксимация фактически имеет место при преобразовании десятичной дроби в float
.Я могу удивить вас, но 281.583
не может быть представлен точно как число с плавающей запятой на ПК.это происходит потому, что числа с плавающей запятой представляются в виде суммы двоичных дробей в ПК.0.5
, 0.25
и 0.125
могут быть преобразованы точно, но не 0.583
.
Плавающие (и двойные) представлены как Σ( 1/2^i*Bi )
, где Bi
- i-й бит (0|1)
.0.625 = 1/2 + 1/4
например.Проблема заключается в том, что не все десятичные дроби можно преобразовать в конечную сумму двоичных дробей.
Вот как преобразуется это число (первая строка - определение столбцов).
i| *2 and trim| Bit value| (2^-1)*bit
0,583
1 1,166 1 0,5
2 0,332 0 0
3 0,664 0 0
4 1,328 1 0,0625
5 0,656 0 0
6 1,312 1 0,015625
7 0,624 0 0
8 1,248 1 0,00390625
9 0,496 0 0
10 0,992 0 0
11 1,984 1 0,000488281
12 1,968 1 0,000244141
13 1,936 1 0,00012207
14 1,872 1 6,10352E-05
15 1,744 1 3,05176E-05
16 1,488 1 1,52588E-05
17 0,976 0 0
18 1,952 1 3,8147E-06
19 1,904 1 1,90735E-06
SUM= 0,582998276