איך מעגלים מספר ב-C?...

annefan

New member
קוטם, קוטם

בגלל זה אני מוסיף 0.5 למספר. אבל חוץ מזה יש את rint ואת nearbyint שעושות הכל חינם-חינם.
 
כן - ככה עשיתי את זה...../images/Emo26.gif

פשוט נראה לי מוזר שיש ceil ו-floor ואין איזה round או משהו... אבל תודה בכל מקרה...
 

annefan

New member
יש, יש

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

כי אני לא כל-כך מוצא אותן...
(אגב - תודה על המאמץ!)
 

annefan

New member
אני דפוק

מלא זמן לא התקרבתי לפונקציות האלה. יש גם סתם round. הפונקציות המסובכות שהזכרתי, גם הן סטנדרטיות, אבל רק ב-C99.
 
גם אני זכרתי...../images/Emo26.gif

אבל נכנסתי ל-index (הם עובדים ב-turbo c) ולא מצאתי אותה!
 

annefan

New member
סתם בשביל הקטע

הסתכלתי בסטנדרטים של C ושל ++C. הפונקציות שהזכרתי סטנדרטיות ב-C99, ו-gcc אכן מממש אותן. הן לא סטנדרטיות ב-++C, כי הסטנדרט הזה מבוסס על C90. ומכאן למדתי שהקומפיילר של MS (VC7.1(, הוא קומפיילר ++C ולא קומפיילר C. מעניין...
 

eyal the one

New member
שאלה שמטרידה אותי

למה בכלל צריך casting זה נראה כאילו זה מיותר תנסה להריץ את הקוד הבא
double d = 1.5; int roundd = (d + 0.5);​
תקבל בדיוק אותו דבר (בקומפילר של VS אפילו בלי warnings (לא יודע בקשר לאחרים))
 

selalerer

New member
בקומפיילר אחר פשוט תקבל Warning

מיותר. ככה הקומפיילר יודע שזה מה שהתכוונת לעשות.
 
קומפיילר טוב יתן...../images/Emo26.gif

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

the new L

New member
זה לא מיותר

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