עבור לתוכן

צריך עזרה במציאת אלגוריתם יעיל להפיכת מספר עשרוני לשבר פשוט

Featured Replies

פורסם

הפונקציה מקבל משתנה או מספר מסוג double

חשבתי על משהו בסגנון:

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

אם לא אני אוסיף את המספר השני למספר הראשון (כך שהם יהיו עכשיו מספר דו ספרתי) ואחזור על הפעולה הראשונה

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

ואפשר לעשות שבמקרה שיש עד X ספרות ללא חזרה כמו 0.671 הוא יופיע כ671/1000

א. אני לא בטוח שזה הגיוני אולי לא חשבתי על משהו ...

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

תודה

פורסם

פשוט תספור את מספר הספרות אחרי הנקודה - נניח X. עכשיו תקח את המספר המקורי (נניח A) ותשתמש במימוש טוב של GCD על שני המספרים: A*10^X ועל

10^X (אמור להיות 10 בחזקת X - העברית אנגלית פה דפוקה...). עכשיו תחלק את שני המספרים בתוצאה וקיבלת שבר פשוט.

לדוגמא עבור 0.672 תעשה GCD של 672 ושל 1000. התוצאה היא 8. אם נחלק נקבל 84/125.

פורסם
  • מחבר

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

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

אבל אין דרך להמנע מזה נכון P: ?

פורסם

FLOAT במחשב בנוי ממנטיסה(ביטים שמציינים את המספר שלאחר הנקודה) והחזקה.

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

בתור המכנה אתה יכול לקחת 2^חזקה.

פורסם
  • מחבר

FLOAT במחשב בנוי ממנטיסה(ביטים שמציינים את המספר שלאחר הנקודה) והחזקה.

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

בתור המכנה אתה יכול לקחת 2^חזקה.

אני מצתער אבל איבדתי אותך אחרי המבנה של הFLOAT אתה יכול לתת יותר לפרט קצת יותר על מה אתה מציע לעשות?

פורסם

כל מספר float מיוצג (בערך, לשם ההדגמה) בצורה הבאה:

2^p * 1.man

כאשר man זה רצף ביטים, וp זו החזקה. אתה יכול לקחת את ה 1.man ולהפוך אותו ל 1man(וכמובן להחסיר את מספר ההזזות של הנקודה ימינה מp). אם p הוא שלילי, הרי המונה הוא 1man והמכנה הוא 2^-p(שזה בעצם 1/2^p). אם p נשאר חיובי, המכנה הוא 1, ואתה צריך להכפיל את המספר 1man ב- 2^p.

הבעיה היחידה שאני רואה כאן זה שיש לint גבול, וסביר להניח שתהייה חריגה אם p נשאר חיובי.

ארכיון

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

דיונים חדשים