Ваш «проблемный» термин:
SQRT( 1 - 1 / ( 1 + Ux2 + Uy2 ) )
Поскольку SQRT(a)
идентичен SQRT(b*b * a) / b
(т.е. умножить внутри квадрат- root на b
- возведя в квадрат и разделив результат на b
), затем - используя (1 + Ux2 + Uy2)
для b
- вы получите:
SQRT( (1 + Ux2 + Uy2)*(1 + Ux2 + Uy2) - (1 + Ux2 + Uy2) ) / (1 + Ux2 + Uy2)
, который должен быть равен одному и тому же значению, не вызывая деление на ноль.
Вероятно, было бы также полезно вывести некоторые общие выражения (например, 1 + Ux2 + Uy2
) в переменные.
Чтобы понять почему вас нужно сделать это, вам нужно искать в области Числовой анализ (Википедия), в частности, Генерация и распространение ошибок , которые решают проблему представления произвольных действительных чисел с схемами с ограниченной точностью, используемыми в большинстве компьютерных языков.
Я далеко не эксперт в этом, но по сути, вы должны признать, что хотя 1 - 1 / ( 1 + x )
всегда будет "действительным", предполагая, x
является, по крайней мере, немного положительным, в большинстве компьютерных систем Примечания, 1 + x
будет вырождаться ровно 1
для достаточно малого x
. Часть Числовой анализ распознает это и реорганизует как вы выполняете вычисления, чтобы лучше использовать ограниченную точность.