Пока числа не слишком далеко друг от друга (например, 2 ^ 1024 и 0,005), результаты должны быть точными. Числа с плавающей запятой двойной точности работают следующим образом: 1 бит для знака, 11 для экспоненты и 52 бита для мантиссы. Конечное число ((-1) * (знак)) (1.mantissa << (экспонента - 1 << 10)), поэтому при добавлении между двумя числами происходит следующее: </p>
x = number with greatest exponent
y = number with smallest exponent
(in case of same sign)
z.mantissa = x.mantissa + (y.mantissa >> (x.exponent - y.exponent) )
sign = either_one.sign
(in case of opposite sign)
z.mantissa = x.mantissa - (y.mantissa >> (x.exponent - y.exponent) )
sign = x.sign
для умножения / деления это немного проще:
z.exponent = x.exponent + y.exponent
z.mantissa = 1.(x.mantissa) (operand) (y.mantissa)
z.sign = x.sign != y.sign
while (z.mantissa is not in format 1.x)
z.mantissa << 1 (division)
z.exponent--
z.mantissa >> 1 (multiplication)
z.exponent++
Итак, что происходит, если показатели находятся слишком далеко друг от друга, когда произойдет сдвиг, произойдет потеря данных, что означает, что точность для двойной точности (с плавающей запятой в общем) не является точной на 100% (особенно потому, что некоторые числа превращаются в периодические опустошает). Для совершенных целых чисел (и результатов), однако, это должно быть в порядке, если число имеет длину до 52 бит (размер мантиссы), поскольку оно может быть преобразовано в целое число процессором (например, 1.111 << 3 равно 1111 ). </p>