מספרים פראיים באמת (העשרה)

אז כחלק מבדיקות הקוד שכתבתי ניסיתי לעשות שנניגנס ולהכניס מספרים גדולים במיוחד, אבל שמתי לב שלחלקם אני לא מקבל תוצאות כמצופה.
המספר 10000000000000000000000 מניב תוצאות כצפוי והפלט שלו מורכב אך ורק מהמספרים 2 ו-5.
המספר 100000000000000000000000 לעומת זאת, על אף שבסך הכל הוכפל ב-10 ולכן אמור לפלוט פעם נוספת 2 ופעם נוספת 5, מניב תוצאות שונות לחלוטין ודורש זמן ריצה ארוך במיוחד.
לאחר בדיקה בvisualizer גיליתי שהחלוקה הראשונית של המספר ב2 נותנת את התוצאה 49999999999999995805696.0 ולא 50000000000000000000000 כמו שמצופה ממנה.
למה זה בעצם קורה?

*המספר כתוב בvisualizer (ואני משער שכך הוא גם שמור בזכרון המחשב) כ-1e+23, אבל גם הדוגמה הראשונה כתובה בתצורה דומה (1e+22).

יש מצב שאתה משתמש בהרבה פעולות חלוקה, ואז מכפיל בחזרה?

לא מכפיל ולו פעם אחת. מחלק אך ורק בגורמים שלא מייצרים שארית.

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

In [12]: (333333/999999) * 10 * 999999
Out[12]: 3333329.9999999995

או אפילו פשוט יותר:

In [13]: 0.1 * 3
Out[13]: 0.30000000000000004

הפתרון הוא להשתמש בספרייה שמיועדת לכך (איזו? מצא אותה).
אם תרצה אקסטרה הרחבה, תוכל לקרוא פה:

https://fabiensanglard.net/floating_point_visually_explained/index.html