יום π שמח

15/03/2010

אין תגובות

אתמול (ארבעה עשר במרץ ציינו את יום ה-π הבינלאומי.

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

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

Declare    @N Int;

Set        @N=1000;

With Nm As

(Select    0 N,

        Cast(Null As Int) Mone,

        Cast(Null As Int) Mehane,

        Pi() Hefresh

Union All

Select    N,

        Case When Hefresh<HefreshOld Then N Else Mone End Mone,

        Case When Hefresh<HefreshOld Then Mehane Else MehaneOld End Mehane,

        Case When Hefresh<HefreshOld Then Hefresh Else HefreshOld End Hefresh

From    (Select    N+1 N,

                N Nold,

                Mone,

                Cast(Round((N+1)/Pi(),0) As Int) Mehane,

                Mehane MehaneOld,

                Abs(Pi()-Case When Round((N+1)/Pi(),0)<>0 Then (N+1)/Round((N+1)/Pi(),0) End) Hefresh,

                Hefresh HefreshOld

        From    Nm

        Where    N<@N) T)

Select    *

From    Nm

Where    N=@N

Option (MaxRecursion 0);

השיטה השניה קצת יותר יעילה- לכל שורה מחשבים את ההפרש, ומציגים בסוף את בעלת ההפרש המינימלי:

Declare    @N Int;

Set        @N=1000;

With Nm As

(Select    1 N,

        Cast(1 As Int) Mehane,

        Cast(Pi() As Float) Hefresh

Union All

Select    N+1 N,

        Cast(Round((N+1)/Pi(),0) As Int) Mehane,

        Cast(Abs(Pi()-(N+1)/Round((N+1)/Pi(),0)) As Float) Hefresh

From    Nm

Where    N<@N)

Select    Top 1 *

From    Nm

Order By Hefresh

Option (MaxRecursion 0);

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *