צריכה עזרה

  • פותח הנושא yc3
  • פורסם בתאריך

yc3

New member
צריכה עזרה

שלום,אני כותבת תכנית ב-ג'אווה.בתכנית יש משתנה X שמוגדר: double X=1.2 בתוך לולאת while אני מקדמת את X: X=X+0.1 ומשום מה בהרצת התכנית מודפס: X=1.3 , X=1.2 , ו... X=1.4000000000000001 וכך הלאה... מה אני אמורה לכתוב כדי שהוא יקדם את X בצורה נכונה?(זה משפיע לי אח"כ על החישובים)
 

erezsh

New member
את לא

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

nirtheking

New member
אני חולק על דעתך

אפשר להשתמש במחלקה DecimalFormat כדי לתת תבנית ל-DOUBLE שתעשה עד שיהיה אפשר עד שני מספרים אחרי הנקודה ואז החישובים שלך ידייקו יותר
 

slepax

New member
כן רק ש

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

yc3

New member
תודה רבה

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

vinney

Well-known member
קצת מתמטיקה

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

yc3

New member
יש השפעה על החישובים

אי הדיוק השפיע לי על החישובים: בתכנית שכתבתי קולטים N מספרים.(N יכול להיות או 10 או 100 או 1000 או 5000). יש מערך בגודל N*X ,כל מספר נכנס למערך לתא של שארית החלוקה שלו במספר התאים במערך(ז"א X*N). לכן,כאשר X=1.4,N=10 , המספר 546 צריך להיכנס לתא 0 שהרי:546/14=39 עם שארית 0. ומכיון ש-X היה שוה 1.4000000000000001 ,המספר 546 הוכנס לתא 13 ולא לתא 0! לכן היה חשוב לי הדיוק!!!
 

vinney

Well-known member
אני מחזיר אותך למתמטיקה

X במקרה שלך שווה ל 1.4. אבל הייצוג של המספר הזה במחשב יכול להיות מדויק בצורה מאוד מוגבלת, לכן כשאת מבצעת חישובים, את צריכה בכל שלב לדעת מה הדיוק המשמעותי עבורך. הבעיה שלך הייתה שהתייחסת לאי דיוק במספר ה17!!! מדעני אטום לא צריכים כזה דיוק!!! תתעלמי מזה, וזהו. איך מתעלמים מזה ? מכפילים ב10 בחזקת N כשN זה מספר הספרות המשמעותי, ומתעלמים מהשבר, למשל.
 
למעלה