Обозначим через (мне было лень пытаться получить обведенную версию оператора деления) аналоги с плавающей запятой точного умножения ( ), сложения ( ) и вычитания ( ) соответственно. Предположим (IEEE-754), что для всех них
где - машинный эпсилон, дающий верхнюю границу относительной ошибки из-за округления. Мы также будем использовать следующую лемму (при условии, что все , а не слишком велика), которую легко доказать:
× + - [ x ⊕ y ] = ( x⊗,⊕,⊖×+−ϵ m a c h | δ я | ≤ ϵ m a c h m m ∏ i = 1 ( 1 + δ
[x⊕y]=(x+y)(1+δ⊕),|δ⊕|≤ϵmach,
ϵmach|δi|≤ϵmachm∏i=1m(1+δi)=1+θ(m),|θ(m)|≤mϵmach1−mϵmach
Давайте определим истинную функцию которая работает с действительными числами какfx,y,z
f(x,y,z)=(x×z)−(y×z)
и две версии реализации функции в IEEE-совместимой арифметике с плавающей точкой, такие как и которые работают с представлениями с плавающей точкой , следующим образом:f1~f2~x~=x(1+δx),y~,z~
f1~(x~,y~,z~)=(x~⊗z~)⊖(y~⊗z~),
f2~(x~,y~,z~)=(x~⊖y~)⊗z~.
Анализ ошибок для :f1~
f1~=((x(1+δx)×z(1+δz))(1+δ⊗xz)(x~⊗z~)−(y(1+δy)×z(1+δz))(1+δ⊗yz)(y~⊗z~))(1+δ⊖)=xz(1+δx)(1+δz)(1+δ⊗xz)(1+δ⊖)−yz(1+δy)(1+δz)(1+δ⊗yz)(1+δ⊖)=xz(1+θxz,1)−yz(1+θyz,1).
Здесь .
|θxz,1|,|θyz,1|≤4ϵmach1−4ϵmach
Аналогично, для
Здесь .f2~
f2~=(((x(1+δx)−y(1+δy)(1+δ⊖xy))×(z(1+δz)))(1+δ⊗)=xz(1+δx)(1+δz)(1+δ⊖xy)(1+δ⊗)−yz(1+δy)(1+δz)(1+δ⊖xy)(1+δ⊗)=xz(1+θx,2)−yz(1+θy,2).
|θx,2|,|θy,2|≤4ϵmach1−4ϵmach
Итак, для и мы получили выражения одного типа, поэтому я не понимаю, почему одна реализация предпочтительнее другой с числовой точки зрения (за исключением того факта, что выполняет только 2 операции с плавающей точкой по сравнению с ).f1~f2~f2~f1~
Вычисление относительной ошибки покажет, что проблема связана с тем, что и могут быть очень близки ( отмена ).xy
|f1~−f||f|=|xz+xzθxz,1−yz−yzθyz,1−(xz−yz)||xz−yz|=|xθxz,1−yθyz,1||x−y|≤|x|+|y||x−y|4ϵmach1−4ϵmach,
|f2~−f||f|=|xz+xzθx,2−yz−yzθy,2−(xz−yz)||xz−yz|=|xθx,2−yθy,2||x−y|≤|x|+|y||x−y|4ϵmach1−4ϵmach.
Незначительные различия между могут сделать одну из двух числовых реализаций незначительно лучше или хуже в зависимости от . Однако я сомневаюсь, что это может иметь какое-либо значение. Результат полностью имеет смысл, потому что, независимо от того, что, если вам нужно вычислить , когда и достаточно близки по значениям (для точности, с которой вы работаете), используя арифметику с плавающей точкой, никакое масштабирование не поможет вам: ты уже в беде.x , y , z ( x - y ) x yθx,y,z(x−y)xy
NB: Все обсуждения выше предполагают, что нет переполнения или недостаточного значения, то есть , - набор всех нормальных чисел с плавающей точкой.F 0x,y,z,f(x,y,z)∈F0F0