באנליזה נומרית, **ביטול הרסני** היא תופעה בה הדיוק של חיסור של שני מספרים עם שגיאה קטנה גוררת שגיאה גדולה. דבר זה עלול לקרות גם אם החיסור הוא מדויק.

לדוגמה, נניח שיש לנו שני עמודי עץ, אחד באורך {\displaystyle L\_{1}=254.5\,{\text{cm}}} והשני {\displaystyle L\_{2}=253.5\,{\text{cm}}}. אם נמדוד אותם בסרגל בעל דיוק של סנטימטר, אנחנו עלולים לקבל ערכים: {\displaystyle {\tilde {L}}\_{1}=255\,{\text{cm}}}, {\displaystyle {\tilde {L}}\_{2}=253\,{\text{cm}}}, שמתאימים להרבה שימושים: שגיאה יחסית של פחות מ-2% מהאורך האמיתי: {\displaystyle |L\_{1}-{\tilde {L}}\_{1}|/|L\_{1}|<2\%}.

אבל אם נחשב את ההפרש בין הערכים המשוערים, נקבל: {\displaystyle {\tilde {L}}\_{1}-{\tilde {L}}\_{2}=255\,{\text{cm}}-253\,{\text{cm}}=2\,{\text{cm}}}, לעומת הפרש אמיתי של {\displaystyle L\_{1}-L\_{2}=254.5\,{\text{cm}}-253.5\,{\text{cm}}=1\,{\text{cm}}}. השגיאה היחסית היא כעת 100%.

ביטול הרסני עלול לקרות גם אם החיסור מתבצע ללא שגיאה נוספת, כפי שקרה בדוגמה שלנו. כאשר משתמשים בחישובי נקודה צפה של ערכים קרובים, החישוב של החיסור יהיה די מדויק בגלל הלמה של סטרבנץ, אבל הביטול ההרסני עדיין קורה.

ניתוח פורמלי
------------

פורמלית, ביטול הרסני קורה בגלל שחיסור היא פעולה בעלת מספר התניה גרוע עבור ערכים קרובים: גם אם המספרים המשוערכים {\displaystyle {\tilde {x}}=x(1+\delta \_{x})}, {\displaystyle {\tilde {y}}=y(1+\delta \_{y})} הם בעלי שגיאה יחסית נמוכה {\displaystyle |\delta \_{x}|=|x-{\tilde {x}}|/|x|} {\displaystyle |\delta \_{y}|=|y-{\tilde {y}}|/|y|} בהתאמה, השגיאה היחסית של פעולת החיסור היא בעלת פרופורציה הפוכה להפרש האמיתי בין הערכים:





x
~

−

y
~



=
x
(
1
+

δ

x

)
−
y
(
1
+

δ

y

)
=
x
−
y
+
x

δ

x

−
y

δ

y



=
x
−
y
+
(
x
−
y
)

x

δ

x

−
y

δ

y

x
−
y



=
(
x
−
y
)

(

1
+

x

δ

x

−
y

δ

y

x
−
y


)

.



{\displaystyle {\begin{aligned}{\tilde {x}}-{\tilde {y}}&=x(1+\delta \_{x})-y(1+\delta \_{y})=x-y+x\delta \_{x}-y\delta \_{y}\\&=x-y+(x-y){\frac {x\delta \_{x}-y\delta \_{y}}{x-y}}\\&=(x-y){\biggr (}1+{\frac {x\delta \_{x}-y\delta \_{y}}{x-y}}{\biggr )}.\end{aligned}}}

{\displaystyle {\begin{aligned}{\tilde {x}}-{\tilde {y}}&=x(1+\delta _{x})-y(1+\delta _{y})=x-y+x\delta _{x}-y\delta _{y}\\&=x-y+(x-y){\frac {x\delta _{x}-y\delta _{y}}{x-y}}\\&=(x-y){\biggr (}1+{\frac {x\delta _{x}-y\delta _{y}}{x-y}}{\biggr )}.\end{aligned}}}
וכך אנו נוכחים שהשגיאה היחסית של החיסור המדויק {\displaystyle {\tilde {x}}-{\tilde {y}}} של המספרים המשוערכים היא:



|


x

δ

x

−
y

δ

y

x
−
y


|

.

{\displaystyle {\biggl |}{\frac {x\delta \_{x}-y\delta \_{y}}{x-y}}{\biggr |}.}

{\displaystyle {\biggl |}{\frac {x\delta _{x}-y\delta _{y}}{x-y}}{\biggr |}.}
והיא עלולה להיות גדולה מאוד אם הערכים האמיתיים x ,y קרובים.

באלגוריתמים נומריים
-------------------

באלגוריתמים נומריים, חישוב של חיסור של מספרי נקודה צפה קרובים עשוי לא להוסיף אף שגיאה או שגיאה קטנה לחישוב עקב הלמה של סטרבנץ. אבל הביטול ההרסני עלול *להגביר* שגיאות שנוצרו עקב עיגול מספרים קודם. כדוגמה, בחישוב פונקציות טריגונומטריות הפוכות עבור מספרים מרוכבים, מפתה לכתוב את הנוסחה הלוגריתמית ישירות:



arcsin
⁡
(
z
)
=
i
log
⁡

(

1
−

z

2

−
i
z

)

.

{\displaystyle \arcsin(z)=i\log {\bigl (}{\sqrt {1-z^{2}}}-iz{\bigr )}.}

{\displaystyle \arcsin(z)=i\log {\bigl (}{\sqrt {1-z^{2}}}-iz{\bigr )}.}
כדוגמה בעייתית של שלב החיסור באלגוריתם, נניח למשל: {\displaystyle z=iy} וכן {\displaystyle y\ll 0}.
וכך מתקבל:
{\displaystyle {\sqrt {1-z^{2}}}\approx -y}
{\displaystyle iz=-y}
ההפרש בין המספרים הוא כמעט אפסי, נבטא את ההפרש: \varepsilon —a

וכעת, אם נחשב את החיסור בנקודה צפה:



fl
⁡

(

fl
⁡
(
1
−
fl
⁡
(

z

2

)
)

)

=

1
−

z

2

(
1
+
δ
)

{\displaystyle \operatorname {fl} {\Bigl (}{\sqrt {\operatorname {fl} (1-\operatorname {fl} (z^{2}))}}{\Bigr )}={\sqrt {1-z^{2}}}(1+\delta )}

{\displaystyle \operatorname {fl} {\Bigl (}{\sqrt {\operatorname {fl} (1-\operatorname {fl} (z^{2}))}}{\Bigr )}={\sqrt {1-z^{2}}}(1+\delta )}
ונבצע את החישוב ללא תוספת שגיאה {\displaystyle \delta \neq 0} עקב חישוב של נקודה צפה {\displaystyle \operatorname {fl} (\cdots )}
וכעת, ההפרש בין המספרים:



1
−

z

2

(
1
+
δ
)
−
i
z

{\displaystyle {\sqrt {1-z^{2}}}(1+\delta )-iz}

{\displaystyle {\sqrt {1-z^{2}}}(1+\delta )-iz}
של שני המספרים הקרובים, ששניהם קרובים לערך {\displaystyle -y}, עשוי להגביר את השגיאה באחד ערכי הקלט בפקטור של {\displaystyle 1/\varepsilon }—a שהוא מאוד גדול, בגלל שההפרש ביניהם הוא מאוד קטן.

דוגמה מספרית:
אם {\displaystyle z=-1234567i} אז הערך המדויק של {\displaystyle \arcsin(z)} הוא בסביבות {\displaystyle -14.71937803983977i}, אבל בשימוש בנוסחה הלוגריתמית בנקודה צפה של בעלת 64 ביטים תתקבל תוצאה של {\displaystyle -14.719{\underline {644263563968}}i}, עם רק 5 מתוך 16 ספרות נכונות, וכל שאר הספרות (עם קו תחתון) הן שגויות.

במקרה של {\displaystyle z=iy} אבל {\displaystyle y<0}, אם נשתמש בזהות {\displaystyle \arcsin(z)=-\arcsin(-z)} נצליח להימנע מביטול הרסני, וזה בגלל שמתקיים: {\displaystyle {\sqrt {1-(-z)^{2}}}={\sqrt {1-z^{2}}}\approx -y} אבל {\displaystyle i(-z)=-iz=y}, ולכן החיסור הוא חיבור עם אותו הסימן שלא סובל מתופעת הביטול ההרסני.

ביטול הרסני הוא לפעמים שימושי ורצוי. למשל בחישוב אלגוריתמי 2Sum תלויים בביטול הרסני אחרי שגיאת עיגול: הם משתמשים בביטול הרסני כדי לחשב את השגיאה בחישוב נקודה צפה.

ראו גם
------

* אנליזה נומרית

הערות שוליים
------------

1. ↑  Muller, Jean-Michel; Brunie, Nicolas; de Dinechin, Florent; Jeannerod, Claude-Pierre; Joldes, Mioara; Lefèvre, Vincent; Melquiond, Guillaume; Revol, Nathalie; Torres, Serge (2018). *Handbook of Floating-Point Arithmetic* (2nd ed.). Gewerbestrasse 11, 6330 Cham, Switzerland: Birkhäuser. p. 102. doi:10.1007/978-3-319-76526-6. ISBN 978-3-319-76525-9.`{{cite book}}`: תחזוקה - ציטוט: location (link)
2. ↑  Goldberg, David (במרץ 1991). "What every computer scientist should know about floating-point arithmetic". *ACM Computing Surveys*. New York, NY, United States: Association for Computing Machinery. **23** (1): 5–48. doi:10.1145/103162.103163. ISSN 0360-0300. נבדק ב-2020-09-17. `{{cite journal}}`:  (עזרה)