Działania arytmetyczne w arytmetyce fl

by Jerry Sky

2020-10-06



1. Reprezentacja liczb w fl

notatka «Numeryczna reprezentacja liczb»


2. Oznaczenia działań

Niech

będą liczbami w arytmetyce fl, wówczas przez fl(x∗y)=fl(x⊛y) fl(x * y) = fl(x \circledast y) oznaczamy wynik działania x∗yx * y, gdzie ∗∈{+,−,/,⋅}* \in \{+, -, /, \cdot\}, w arytmetyce fl.


3. Przykład

Mamy

Używamy akumulatora o podwójnej długości do pośrednich obliczeń.

x+y=po wyroˊwnaniu cech0.9289126000⋅105→zaokrągl.fl(x+y)=0.92891⋅105 x + y \overset{\text{po wyrównaniu cech}}{=} 0.9289126000 \cdot 10^5\\ \xrightarrow{\text{zaokrągl.}} fl(x + y) = 0.92891 \cdot 10^5 x−y=po wyroˊwnaniu cech−0.9226274000⋅105→zaokrągl.fl(x−y)=−0.92263⋅105 x - y \overset{\text{po wyrównaniu cech}}{=} -0.9226274000 \cdot 10^5\\ \xrightarrow{\text{zaokrągl.}} fl(x-y) = -0.92263 \cdot 10^5 x⋅y=0.2909334802⋅108→zaokrągl.fl(x⋅y)=0.29093⋅108 x \cdot y = 0.2909334802 \cdot 10^8 \xrightarrow{\text{zaokrągl.}} fl(x \cdot y) = 0.29093 \cdot 10^8 xy≈0.3394579647⋅10−2→zaokrągl.fl(xy)=0.33946⋅10−2 \frac{x}{y} \approx 0.3394579647 \cdot 10^{-2} \xrightarrow{\text{zaokrągl.}} fl\left(\frac{x}{y}\right) = 0.33946 \cdot 10^{-2}

3.1. Błędy

Błędy względne:

Precyzja arytmetyki:
ϵ=5⋅10−5\epsilon = 5 \cdot 10^{-5}


4. Przykład (dodawanie kiedy x≫yx \gg y)

Niech

Wówczas: x+y=mxβcx+myβcy=(mx+myβ−(cx−cy))βcx=msβcx x + y = m_x\beta^{c_x} + m_y \beta^{c_y} = (m_x + m_y\beta^{-(c_x - c_y)}) \beta^{c_x} = m_s \beta^{c_x}

schemat liczb

Z powyższego rysunku wynika, że dla x≫yx \gg y
mamy fl(x+y)=xfl(x+y) = x.


5. Warunek na błędy

Arytmetyka fl powinna zapewnić równość fl(x∗y)=rd(x∗y) fl(x * y) = rd(x*y) dla ∗∈{+,−,/,⋅}* \in \{+, -, /, \cdot\} oraz x∗y∈[−MAX; MAX]x * y \in [-\mathrm{MAX};~ \mathrm{MAX}].

Jeśli powyższe jest prawdziwe, to zachodzi równość fl(x∗y)=(x∗y)(1+δ) fl(x * y) = (x*y)(1 + \delta) gdzie ∣δ∣≤ϵ|\delta| \le \epsilon, ϵ=0.5β1−t\epsilon = 0.5\beta^{1-t}


6. Przykład (narastający błąd po 33 działaniach)

Obliczymy x(y+z)x(y + z) w fl. (x=rd(x)x = rd(x), y=rd(y)y = rd(y), z=rd(z)z = rd(z))

fl(x(y+z))=fl(x⋅fl(y+z))=[x⋅fl(y+z)](1+δ1)=[x(y+z)(1+δ2)](1+δ1)=x(y+z)(1+δ2+δ1+δ2δ1)≈x(y+z)(1+δ2+δ1)=x(y+z)(1+δ3)fl(x(y+z)) = fl(x \cdot fl(y+z)) = [x \cdot fl(y+z)](1 + \delta_1) = [x(y+z)(1 + \delta_2)](1 + \delta_1) = x(y+z)(1 + \delta_2 + \delta_1 + \delta_2\delta_1) \approx x(y+z)(1+ \delta_2 + \delta_1) = x(y+z)(1+\delta_3)

gdzie ∣δi∣≤ϵ, i=1,2|\delta_i| \le \epsilon,~ i = 1,2, za to ∣δ3∣≤2ϵ|\delta_3| \le 2\epsilon


7. Twierdzenie#1

Jeśli ∀i=1,…,n∣δi∣≤ϵ\forall i = 1,\dots,n \enspace |\delta_i| \le \epsilon oraz ∏i=1n(1+δi)=1+En\prod_{i=1}^n(1 + \delta_i) = 1 + E_n oraz nϵ<2n_\epsilon < 2, wówczas ∣En∣<nϵ1−0.5nϵ≈nϵ |E_n| < \frac{n \epsilon}{1 - 0.5n\epsilon} \approx n\epsilon

7.1. D-d

∣En∣=∣∏i=1n(1+δi)−1∣≤(1+ϵ)n−1=1+(n1)ϵ+(n2)ϵ2+(n3)ϵ3+⋯+(nn)ϵn−1=nϵ+nϵ(n−1)ϵ2!+nϵ(n−1)ϵ(n−2)ϵ3!+⋯+nϵ(n−1)ϵ⋯1ϵn!=nϵ(1+(n−1)ϵ2!+(n−1)ϵ(n−2)ϵ3!+⋯+(n−1)ϵ⋯1ϵn!)q=nϵ2<1∣En∣<nϵ(1+q+q2+⋯+qn−1)=nϵ1−qn1−q<nϵ1−0.5nϵ≈nϵ■ \begin{aligned} |E_n| &= \left|\prod_{i=1}^{n} (1 + \delta_i) - 1\right| \le (1 + \epsilon)^n - 1\\ &= 1 + \binom{n}{1}\epsilon + \binom{n}{2}\epsilon^2 + \binom{n}{3}\epsilon^3 + \dotsb + \binom{n}{n}\epsilon^n - 1\\ &= n\epsilon + \frac{n\epsilon(n-1)\epsilon}{2!} + \frac{n\epsilon(n-1)\epsilon(n-2)\epsilon}{3!} + \dotsb + \frac{n\epsilon(n-1)\epsilon\dotsb1\epsilon}{n!}\\ &= n\epsilon\left( 1 + \frac{(n-1) \epsilon}{2!} + \frac{(n-1)\epsilon(n-2)\epsilon}{3!} + \dotsb +\frac{(n-1) \epsilon \dotsb 1 \epsilon}{n!} \right)\\ &\qquad q = \frac{n\epsilon}{2} < 1\\ |E_n| &< n\epsilon(1 + q + q^2 + \dotsb + q^{n-1}) = n\epsilon \frac{1 - q^n}{1 - q} < \frac{n\epsilon}{1 - 0.5n\epsilon} \approx n\epsilon \quad \blacksquare \end{aligned}


8. Przykład (narastający błąd po nn działaniach)

Mamy:

Obliczyć:

Algorytm:

  1. S0=x0S_0 = x_0
  2. for i:=1i := 1 to nn do:
    1. Si:=Si−1+xiS_i := S_{i-1} + x_i
  3. end for

fl(S)=fl(…fl(fl(fl(x0+x1)+x2)+x3)+⋯+xn)=(…(((x0+x1)(1+δ1)+x2)(1+δ2)++x3)(1+δ3)+⋯+xn)(1+δn)=x0∏i=1n(1+δi)+x1∏i=1n(1+δi)++x2∏i=2n(1+δi)+x3∏i=3n(1+δi)+⋯+xn(1+δn) \begin{aligned} fl(S) &= fl(\dots fl(fl(fl(x_0 + x_1) + x_2) + x_3) + \dotsb + x_n)\\ &= (\dots (((x_0 + x_1)(1 + \delta_1) + x_2)(1 + \delta_2) +\\ &+ x_3)(1 + \delta_3) + \dotsb + x_n)(1 + \delta_n)\\ &= x_0 \prod_{i=1}^{n}(1 + \delta_i) + x_1\prod_{i=1}^{n}(1 + \delta_i)+\\ &+ x_2\prod_{i=2}^{n}(1+\delta_i) + x_3\prod_{i=3}^{n}(1+\delta_i) + \dotsb + x_n (1+\delta_n) \end{aligned} przy czym ∣δi∣≤ϵ, i=1,…,n|\delta_i| \le \epsilon,~ i = 1,\dots, n.

Podstawmy ∏i=kn(1+δi)=1+Ek\prod_{i=k}^{n}(1 + \delta_i) = 1+E_k: fl(S)=x0+x0E1+x1+x1E1+x2+x2E2+x3+x3E3+⋯+xn+xnEn=S+x0E1+x1E1+x2E2+x3E3+⋯+xnEn≤S+(x0+x1+x2+x3+⋯+xn)max⁡1≤k≤nEk=S(1+E1) \begin{aligned} fl(S) &= x_0 + x_0E_1 + x_1 + x_1E_1 + x_2 + x_2E_2 + x_3 + x_3E_3 + \dotsb + x_n + x_nE_n\\ &= S + x_0E_1 + x_1E_1 + x_2E_2 + x_3E_3 + \dotsb + x_nE_n\\ &\le S + (x_0 + x_1 + x_2 + x_3 + \dotsb + x_n)\max_{1 \le k \le n} E_k = S(1 + E_1) \end{aligned} gdzie ∣E1∣<nϵ|E_1| < n\epsilon z «Twierdzenie#1».


9. Redukcja cyfr znaczących

Przeanalizujmy zjawisko redukcji cyfr znaczących:

∣x−y−[rd(x)−rd(y)]∣∣x−y∣=∣δxx−δyy∣∣x−y∣≤ϵ∣x∣+∣y∣∣x−y∣ \frac{|x - y - [rd(x) - rd(y)]|}{|x - y|} = \frac{|\delta_x x - \delta_y y|}{|x - y|} \le \epsilon\frac{|x| + |y|}{|x - y|}

Z powyższego oszacowania wynika, że niedokładność danych może przenieść się na wynik z wielkim mnożnikiem ∣x∣+∣y∣∣x−y∣\frac{|x| + |y|}{|x - y|} nawet gdy samo działanie nie wprowadza błędu.

9.1. Przykład

Niech

(x≈yx \approx y)

Różnica dokładna to x−y=0.0001248121x - y = 0.0001248121.

Policzymy x−yx - y w arytmetyce fl.

Zauważmy, że tutaj mamy fl(rd(x)−rd(y))=rd(x)−rd(y)fl(rd(x) - rd(y)) = rd(x) - rd(y).

∣δ∣=∣x−y−[rd(x)−rd(y)]∣∣x−y∣=∣0.0001248121−0.00013∣0.0001248121∣≈4.16⋅10−2|\delta| = \frac{|x - y - [rd(x) - rd(y)]|}{|x - y|} = \frac{|0.0001248121 - 0.00013}{|0.0001248121|} \approx 4.16 \cdot 10^{-2}.

Precyzja arytmetyki ϵ=5⋅10−5\epsilon = 5 \cdot 10^{-5}.


9.2. Przykład

Gdy liczymy wartość wyrażenia x2+1−1\sqrt{x^2 + 1} - 1 kiedy ∣x∣\bold{|x|} jest mała.
W tym przypadku następuje redukcja cyfr znaczących.

Przekształćmy x2+1−1\sqrt{x^2 + 1} - 1: y=(x2+1−1)x2+1+1x2+1+1=x2x2+1+1. y = (\sqrt{x^2 + 1 } - 1) \frac{\sqrt{x^2 + 1} + 1}{\sqrt{x^2 + 1} + 1} = \frac{x^2}{\sqrt{x^2 + 1} + 1}.


10. Twierdzenie#2

Ile cyfr znaczących tracimy przy odejmowaniu x−yx - y, kiedy x≈yx \approx y?

Jeśli xx i yy są dodatnimi liczbami w dwójkowej arytmetyce fl takimi, że x>yx > y oraz 2−q≤1−yx≤2−p2^{-q} \le 1 - \frac{y}{x} \le 2^{-p}, wówczas
tracimy co najmniej pp i co najwyżej qq bitów przy odejmowaniu.

10.1. D-d

Niech xx oraz yy będą dwiema liczbami w dwójkowej arytmetyce fl, czyli x=mx2cx, y=my2cy,x = m_x 2^{c_x},~ y = m_y 2^{c_y},; mx,my∈[12; 1)m_x, m_y \in \left[\frac{1}{2};~ 1\right).

Ponieważ x>yx > y, to aby obliczyć różnicę r=x−yr = x-y musimy wyrównać cechy: r=mx2cx−my2cy=(mx−my2cy−cx)⋅2cx=mr2cx r = m_x 2^{c_x} - m_y 2^{c_y} = (m_x - m_y 2^{c_y - c_x})\cdot 2^{c_x} = m_r 2^{c_x}

Mantysa mrm_r spełnia mr=(mx−my2cy−cx)=mx(1−my2cymx2cx)=mx(1−yx)<2−p. m_r = (m_x - m_y 2^{c_y - c_x}) = m_x \left( 1 - \frac{m_y 2^{c_y}}{m_x 2^{c_x}} \right) = m_x\left( 1 - \frac{y}{x} \right) < 2^{-p}.

Aby znormalizować reprezentację x−yx - y w arytmetyce fl, musimy przesunąć mantysę mrm_r o co najmniej pp bitów w lewo. Wówczas wprowadzone są zera (na prawo), które nie niosą żadnej informacji. Co oznacza redukcję pp znaczących bitów.

Rozumowanie dla drugiej części jest podobne.