עבור לתוכן

חישובים עם מספרים בעלי מאות ספרות בשפת C

Featured Replies

פורסם

ערב טוב.

אני כותב מחשבון (ב GTK+).

אני רוצה לדעת איך באפשרותי לפעול עם מספרים גבוהים ומדוייקים, מספרים שלא נכנסים גם במשתנה long double .

למשל, מספר עם שלוש-מאות ספרות לפני הנקודה ושלוש-מאות נוספים אחרי הנקודה.

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

כמובן בעזרת אסמבלי...

אשמח מאוד לעזרה בנושא.

הערה: במחשבון עצמו יהיה גלילה למספרים, לכן אין לי מגבלה באורך המספר...

תודה רבה על כל עזרה ושבוע טוב,

יוסף אור

פורסם

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

פורסם

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

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

פורסם

אם אתה יכול לעבור לכתוב ב ++C

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

זה לא הכי יעיל אבל הכי פשוט.

פורסם

אין הבדל גדול בין כתיבה של דבר כזה ב-C (באמצעות struct והרבה פונקציות) וב-++C (באמצעות מחלקה). זה רק עניין של תחביר. עדיין צריך להתעסק עם המתמטיקה שמאחורי העניין, לדאוג להקצאות זכרון מתאימות וכו' (טוב, בעצם כאן יש יתרון קטן ל-++C כי אפשר להשתמש ב-vector).

פורסם

תעשה הדמייה של אלגוריתמים של חומרה

תבנה half adders וכו...

פורסם
  • מחבר

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

אבל זה מאוד מסובך.

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

תודה רבה על כל העזרה - אני אשמח כמובן לעוד עזרה, אתם פשוט תותחים :-)

יוסף אור

פורסם

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

פורסם

אכן, לשפות חדשות יותר יש ספריות סטנדרטיות נרחבות יותר, שכוללות דברים כאלה - BigDecimal בג'אווה, BigInteger ב-#C, ובפייתון יש פשוט long (שלא כמו בשפות אחרות, שבהן long פשוט מציין int גדול יותר).

ל-C יש ספריה סטנדרטית די מינימליסטית בהשוואה להנ"ל (סביר להניח שזה נובע מכך שהיא שפה הרבה יותר ישנה). בשביל זה יש חבילות חיצוניות.

פורסם

ל C יש לך את סיפריית GMP

http://gmplib.org/

  • 2 שבועות מאוחר יותר...
פורסם
  • מחבר

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

הגבוה ביותר:

17976931348623157000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000

000000000000000000000000000000000000000000000000000000000000000000000.000000

הנמוך ביותר:

-1797693134862315700000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000

00000000000000000000000000000000000000000000000000000000000000000000000000000000

0000000000000000000000000000000000000000000000000000000000000000000000.000000

הרבה מאוד ספרות, יש לציין...

זה כשהמשתנה הוא double (משום מה אני לא מצליח להשתמש טוב ב ling double).

בכל מקרה, תודה על העזרה - מחשבון כבר יש לי (אם מישהו רוצה זה סתם 585 שורות ב GTK+...) :-)

ערב טוב,

יוסף אור

פורסם

שים לב ש-doubleים לא באמת עובדים ככה.

קרא קצת בויקיפדיה על נקודה צפה (double ו-float הם מספרים מהסוג הזה):

http://he.wikipedia.org/wiki/%D7%A0%D7%A7%D7%95%D7%93%D7%94_%D7%A6%D7%A4%D7%94

למרות שאפשר לייצג מספרים מאוד גדולים באמצעות double, רמת הדיוק תהיה נמוכה. כלומר, לדוגמה אמנם אפשר לייצג את המספר 100000000000000000000000000000000000 ע"י double, אבל את 100000000000000000000000000000000001 אי אפשר, כי המספר יעוגל למטה ל-100000000000000000000000000000000000.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים