הבלוג של גרי רשף

15/03/2010

יום π שמח

Filed under: Uncategorized — תגיות: , , — גרי רשף @ 22:50

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

לרגל המאורע- שתי וריאציות למציאת שני השלמים שהמנה שלהם מהווה הקירוב הטוב ביותר ל-π (שהוא כידוע מספר לא רציונלי) מבין המספרים עד 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);

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

יצירה של אתר חינמי או בלוג ב־WordPress.com.

%d בלוגרים אהבו את זה: