NaN, Infinity, and Divide by Zero ב- VB.NET

ספרי תכנות מתחילים כוללים בדרך כלל אזהרה זו: "אל תחלק באפס! תקבל שגיאת זמן ריצה! "

הדברים השתנו ב VB.NET. למרות שיש יותר תכנות אפשרויות והחישוב מדויק יותר, לא תמיד קל לראות מדוע דברים קורים כמו שהם עושים.

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

מה קורה אם אתה מנהל 'חלק על ידי אפס' ב- VB.NET

אם אתה מריץ תרחיש 'חלק באפס' ב- VB.NET, תקבל תוצאה זו:

 ערכו א, ב, ג כפול

 a = 1: b = 0

 c = a / b

 קונסולה. WritLine (_

 "יש כללי מתמטיקה" _

 & vbCrLf & _

 "בוטל?" _

 & vbCrLf & _

 "חלוקה באפס " _

 & vbCrLf & _

 "בטח אפשרי!") 

אז מה קורה כאן? התשובה היא ש- VB.NET למעשה נותן לך את התשובה הנכונה מבחינה מתמטית. מבחינה מתמטית, אתה פחית מחלקים באפס, אבל מה שאתה מקבל זה "אינסוף".

 ערכו א, ב, ג כפול

 a = 1: b = 0

 c = a / b

 קונסולה. WritLine (_

 "התשובה היא: " _

 & ג)

 'מציג:

 התשובה היא: אינסוף 

הערך "אינסוף" אינו שימושי מדי עבור רוב היישומים העסקיים. (אלא אם כן המנכ"ל תוהה מהו הגבול העליון בבונוס המניות שלו.) אבל זה אכן מונע מהיישומים שלך להתרסק על חריג זמן ריצה כמו שפות פחות חזקות.

instagram viewer

VB.NET מעניק לך גמישות רבה יותר אפילו בכך שאתה מאפשר לבצע חישובים. בדוק את זה:

 ערכו א, ב, ג כפול

 a = 1: b = 0

 c = a / b

 c = c + 1

 'אינסוף פלוס 1 זה

 'עדיין אינסוף 

כדי להישאר נכונים מבחינה מתמטית, VB.NET נותן לך את התשובה NaN (לא מספר) עבור חישובים מסוימים כמו 0/0.

 ערכו א, ב, ג כפול

 a = 0: b = 0

 c = a / b

 קונסולה. WritLine (_

 "התשובה היא: " _

 & ג)

 'מציג:

 התשובה היא: NaN 

VB.NET יכול גם לדעת את ההבדל בין אינסוף חיובי לאינסוף שלילי:

 עומק a1, a2, b, c כפול

 a1 = 1: a2 = -1: b = 0

 אם (a1 / b)> (a2 / b) אז _

 קונסולה. WritLine (_

 "אין סוף אינסופי" _

 & vbCrLf & _

 "גדול מ" _

 & vbCrLf & _

 "אינסוף שלילי.") 

בנוסף ל- PositiveInfinity ו- NegativeInfinity, VB.NET מספקת גם את Epsilon, הערך הכפול החיובי הקטן ביותר הגדול מאפס.

זכור כי כל היכולות החדשות הללו של VB.NET זמינות רק עם סוגי נתונים של נקודה צפה (כפולה או יחידה). והגמישות הזו יכולה להוביל לבלבול של Try-Catch-סוף (טיפול בשגיאות מובנות). לדוגמה, קוד ה- NET שלמעלה פועל מבלי לזרוק שום סוג של חריג, לכן קידודו בתוך חסימת Try-Catch-סוף לא יעזור. כדי לבחון חלוקה באפס תצטרך לקוד מבחן כמו:

 אם ג. ToString = "אינסוף" ואז... 

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

.NET למעשה יש את ה- DivideByZeroException כסוג לגיטימי. אבל אם הקוד לעולם לא מפעיל את החריג, מתי תראה אי פעם את השגיאה החמקמקה הזו?

כשתראה את DivideByZeroException

מסתבר, מיקרוסופטדף MSDN אודות בלוקים Try-Catch-סוף משתמש למעשה בפער באפס דוגמאות כדי להמחיש כיצד לתקן אותם. אבל יש "מלכוד" עדין שהם לא מסבירים. הקוד שלהם נראה כך:

 עמעום כמספר שלם = 0

 Dim b כמספר שלם = 0

 Dim c כמספר שלם = 0


 נסה

 a = b \ c

 תפוס למעט חריג

 קונסולה. WriteLine ("אירעה שגיאת זמן ריצה")

 סוף סוף

 קונסולה. קריאת שורה()

 נסה סוף 

קוד זה עושה להפעיל חלוקה בפועל על ידי חריגה אפסית.

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

שימו לב שהפעולה בה הם משתמשים היא לא לחלק ("/"), זה חלוק שלם ("\")! (דוגמאות אחרות של מיקרוסופט מצהירות למעשה על המשתנים כמספר שלם.) כפי שמתברר, חישוב מספרים שלם הוא רק מקרה שלמעשה זורק את החריג הזה. היה נחמד אם מיקרוסופט (ושאר הדפים שמעתיקים את הקוד שלהם) היו מסבירים את הפרט הקטן הזה.

instagram story viewer