לא נכנס לי לIF - שפת C

help help

New member
לא נכנס לי לIF - שפת C

שלום,

למה שכותבים בצורה כזאת של IF הוא לא נכנס לIF אפילו שהתוצאה נכונה?
וכן בדקתי בהדפסה של PRINTF %f שזה מדפיס לי את התוצאה של הפונקציה עם יותר אפסים אחרי הנקודה, אבל שהוספתי אותם גם לתנאי זה עדיין לא נכנס לי לIF.

הגדרתי בתחילת התוכנית את:
#include <stdio.h>
#include <math.h>
int main ()
{
int flag=0;


if (log(2.718282)==1.00 && log(7.389056)==2.00)
flag++;
if (fmod(13.657, 2.333)==1.992)
flag++;


תודה.
 
אתה לא יכול להשוות שני מספרי float ככה בגלל הנושא של ייצוג של מספרי floating point בצורה בינארית במחשב, הסיכוי ששני מספרים יצאו שווים לחלוטין בכל הביטים שלהם נמוכה מאוד ולכן השוואה עם אופרטור השוויון (==) תצא כמעט תמיד שלילית.

עדיף לבדוק את ההפרש ביניהם. תבדוק fabs(a-b) < EPSILON עבור הגדרה כלשהי של אפסילון המתאים לצרכיך (נגיד 0.001 למשל).
 

help help

New member
לא למדתי עדיין מה זה EPSILON

תוכל לומר לי בדרך אחרת איך לבדוק??
 

NirOxO

New member
epsilon זה פשוט מספר קטן כלשהו

פשוט תבחר הפרש שהוא מספיק מדוייק בשבילך, לדוגמה אם יוצא לך במחשבון 0.666667 אתה מתייחס לזה בתור "2/3" למרות שזה לא 2/3. (יכול להיות ש 0.666667 לא מספיק קרוב עבורך ל 2/3 ואתה מעדיף 0.6666666666667)
בכל מקרה תבחר מספר שבשבילך הוא קטן מספיק ותבדוק אם ההפרש בין שני המספרים שלך קטן מהמספר הזה:
fabs(a-b) < 0.000001
 

help help

New member
אולי לא הייתי ברור, אני אחדד את השאלה שלי

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

אולי עכשיו תוכלו להבין לאן אני חותר.

תודה.
 

nocgod

New member
קודם כל תגידי למרצה שלך שהן עובדות... :)

סתם :)
בגדול הבעיה מתחילה באיך שהמחשב מייצג מספרים לא שלמים (float וdouble) בזיכרון.
ישנם מספרים אי-רציונליים, כלומר כאלה שאי אפשר ליצג אותם כשבר של 2 מספרים שלמים ואין להם מחזוריות בחלק השבר כמו לדוגמא במקרה של 1/3 שהוא בעצם 0.333333333 עם 3 עד אין סוף.
למחשב אין אין-סוף מקומות מזיכרון לייצג מספרים כאלה ומה לעשות שיש המון כאלה. לכן כשאתה מנסה להוציא לוגריתם ממספר, התוצאה אינה מדוייקת, היא מאוד מאוד קרובה לתוצאה המקוייקת אבל היא לא
ולכן...כשאתה מנסה להוציא לוג ממספר שהוא מאוד קרוב ל e (שהוא בעצמו מספר אי רציונלי) התוצאה לא תהיה לעולם 1, היא תהיה מסביב לאחד.
ולכן כדי לבדוק שהפונקציה log נניח עובדת אתה צריך לקחת בחשבון שיש טווח טעות כלשהי. כדי לבדוק שהפונקציה עובדת

abs(log(e) - 1) < err


אתה עוד תלמד את כל החרא הזה על ייצוג floating point ו double precision floating point בקורס של אנליזה נומרית למתכנתים...ואתה עוד תהנה עם ה error bounds :)

בהצלחה.
 
למעלה