חלוקה לפי אפס בג'אווה: חריג, אינסוף או לא מספר

1. סקירה כללית

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

במאמר זה נעבור מה קורה כאשר מתרחשת חלוקה באפס בתוכנית Java.

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

2. שלמים

ראשית, עבור מספרים שלמים הדברים פשוטים למדי. חלוקת מספר שלם באפס תביא ל- חישוב חשבון:

assertThrows (ArithmeticException.class, () -> {int result = 12/0;});
assertThrows (ArithmeticException.class, () -> {int result = 0/0;});

3. סוגי נקודה צפה

עם זאת, בעת התמודדות עם מספרי נקודה צפה, חריג לא ייזרק:

assertDoesNotThrow (() -> {float result = 12f / 0;});

על מנת לטפל במקרים כאלה, Java משתמשת בכמה ערכים מספריים מיוחדים שיכולים לייצג את התוצאות של פעולה כזו: NaN, POSITIVE_INFINITY, ו NEGATIVE_INFINITY.

3.1. NaN

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

assertEquals (Float.NaN, 0f / 0); assertEquals (Double.NaN, 0d / 0);

התוצאה במקרים אלה היא NaN (לא מספר).

3.2. אינסוף

הבא, בואו חלקו כמה ערכים שאינם אפסים באפס:

assertEquals (Float.POSITIVE_INFINITY, 12f / 0); assertEquals (Double.POSITIVE_INFINITY, 12d / 0); assertEquals (Float.NEGATIVE_INFINITY, -12f / 0); assertEquals (Double.NEGATIVE_INFINITY, -12d / 0);

כפי שאנו רואים, התוצאה היא אינסוף, עם השלט תלוי בסימן האופרטים.

יתר על כן, אנו יכולים גם להשתמש במושג אפס שלילי על מנת להגיע NEGATIVE_INFINITY:

assertEquals (Float.NEGATIVE_INFINITY, 12f / -0f); assertEquals (Double.NEGATIVE_INFINITY, 12f / -0f);

3.3. ייצוג זיכרון

אז מדוע חלוקה שלמה באפס מביאה חריג, ואילו חלוקה של נקודה צפה באפס אינה?

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

עכשיו, בואו ניקח בחשבון את הייצוג הבינארי של מצוף כ- S EEEEEEE E FFFFFFF FFFFFFFF FFFFFFFF עם ביט אחד (S) עבור הסימן, 8 ביטים (E) עבור האקספוננט, והשאר (F) עבור המנטיסה.

בכל אחד משלושת הערכים NaN, POSITIVE_INFINITY, ו- NEGATIVE_INFINITY, כל הביטים בחלק המעריך מוגדרים ל -1.

אינסוף יש את סיביות המנטיסה מוגדרות ל -0, בעוד NaN יש מנטיסה שאינה אפסית:

assertEquals (Float.POSITIVE_INFINITY, Float.intBitsToFloat (0b01111111100000000000000000000000)); assertEquals (Float.NEGATIVE_INFINITY, Float.intBitsToFloat (0b11111111100000000000000000000000)); assertEquals (Float.NaN, Float.intBitsToFloat (0b11111111100000010000000000000000)); assertEquals (Float.NaN, Float.intBitsToFloat (0b11111111100000011000000000100000));

4. סיכום

לסיכום הדברים, במאמר זה ראינו כיצד חלוקה באפס עובדת בג'אווה.

ערכים כמו אינסוף ו NaN זמינים למספרים עם נקודה צפה אך לא למספרים שלמים. כתוצאה מכך, חלוקת מספר שלם באפס תביא לחריג. עם זאת, עבור א לָצוּף אוֹ לְהַכפִּיל, ג'אווה מאפשרת את הפעולה.

הקוד השלם זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found