פונקציות מספריות

cos#

מחזיר את הקוסינוס של מספר הנתון ברדיאנים.

cos הוא הקוסינוס הטריגונומטרי הסטנדרטי: הוא מקבל זווית הנמדדת ברדיאנים ומחזיר את היחס בין הניצב הסמוך ליתר במשולש ישר־הזווית המתאים. אם EXPR מושמט, cos פועל על $_. התוצאה היא תמיד מספר בנקודה צפה בקטע הסגור [-1, 1].

תקציר#

cos EXPR
cos

מה מקבלים בחזרה#

מספר בנקודה צפה בדיוק כפול בטווח [-1, 1]. Perl מעביר את הקריאה לשגרת cos(3) של C של הפלטפורמה, ולכן הדיוק והעיגול תואמים את ה־libm שלכם. ערכים מיוחדים פועלים לפי IEEE 754: cos(0) הוא בדיוק 1, cos("inf") ו־cos("nan") שניהם NaN.

רדיאנים, לא מעלות#

הטעות הנפוצה ביותר עם cos היא להזין לו מעלות. סיבוב מלא הוא 2 * π רדיאנים, לא 360. המירו פעם אחת ושימרו את הערך המומר:

use POSIX qw(acos);
my $pi = acos(-1);                  # π to full double precision

sub deg2rad { $_[0] * $pi / 180 }

print cos( deg2rad(60) ), "\n";     # 0.5
print cos( 60 ), "\n";              # -0.952412980415 - wrong if you meant degrees

Math::Trigext מייצא את deg2rad ו־rad2deg אם אינכם רוצים לכתוב את ההמרה בעצמכם.

דוגמאות#

מהלכים על מעגל היחידה בשמונה צעדים ומדפיסים (cos θ, sin θ):

use POSIX qw(acos);
my $pi = acos(-1);

for my $k (0 .. 7) {
    my $theta = $k * $pi / 4;
    printf "%.3f  %+.3f  %+.3f\n",
           $theta, cos($theta), sin($theta);
}

השוואת cos מול טור טיילור שלו סביב אפס. עבור $x קטן, ההרחבה בת ארבעת האיברים מדויקת כבר לעשר ספרות עשרוניות - בדיקת שפיות שימושית בעת העברת קוד מספרי:

sub cos_taylor {
    my $x = shift;
    my $x2 = $x * $x;
    1 - $x2/2 + $x2*$x2/24 - $x2*$x2*$x2/720;
}

my $x = 0.3;
printf "libm:   %.15f\n", cos($x);
printf "taylor: %.15f\n", cos_taylor($x);

ארגומנט ברירת מחדל. בתוך לולאת while (<>), cos ללא ארגומנט קורא את השורה הנוכחית - כמעט תמיד באג, אך השפה מתירה זאת:

$_ = 0;
print cos, "\n";                    # 1

קוסינוס הפוך באמצעות הזהות מתוך perlfunc:

sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ) }

print acos(0.5), "\n";              # 1.0471975511966 (= π/3)

שימוש ב־Math::Trigext עבור מערך המלא של פונקציות הפוכות והיפרבוליות במקום לכתוב משלכם:

use Math::Trig;
print acos(0.5), "\n";              # same result, no hand-written formula

מקרי קצה#

  • ארגומנטים לא־מספריים מומרים ל־0. cos("hello") מחזיר 1 משום שהמחרוזת מומרת תחילה ל־0. תחת use warnings זה מפיק אזהרת Argument "hello" isn't numeric in cos. אמתו את הקלט עם looks_like_number מ־Scalar::Util אם המקור אינו אמין.

  • ארגומנטים גדולים מאוד מאבדים דיוק. cos מצמצם תחילה את הארגומנט שלו מודולו , ועבור |x| בסדר גודל של 1e16 הערך הקרוב ביותר שניתן לייצג בדיוק כפול שונה מ־x ביותר מ־π. התוצאה היא עדיין מספר בטווח [-1, 1], אך היא אקראית בעצם. צמצמו את הזווית בעצמכם לפני הקריאה אם אתם צוברים פאזה על־פני איטרציות רבות.

  • undef מומר ל־0 ומחזיר 1, עם אזהרת ה־uninitialized הרגילה תחת use warnings.

  • מקרים מיוחדים של IEEE: cos("inf"), cos("-inf"), ו־cos("nan") כולם מחזירים NaN. השוו עם $result != $result (הערך היחיד שאינו שווה לעצמו) לזיהוי NaN, או השתמשו ב־POSIX::isnan.

  • אין תמיכה במספרים מרוכבים בפונקציה המובנית. עבור ארגומנטים מרוכבים השתמשו ב־Math::Complexext, אשר מבצע overload ל־cos באמצעות operator overloading:

    use Math::Complex;
    my $z = cplx(1, 2);
    print cos($z), "\n";              # 2.03272300701967-3.0518977991518i
    

הבדלים מ־upstream#

תואם מלא ל־upstream Perl 5.42.

ראו גם#

  • sin - סינוס של זווית ברדיאנים; הפונקציה המלווה הנפוצה ביותר בשימוש לצד cos

  • atan2 - ארקטנגנס דו־ארגומנטי, אבן הבניין הרגילה לטריגונומטריה הפוכה (acos, asin) ב־Perl טהור

  • sqrt - שורש ריבועי; מופיע בזהות הקלאסית של acos acos(x) = atan2(sqrt(1 - x*x), x)

  • Math::Trigext - acos, asin, atan, וריאנטים היפרבוליים, deg2rad/rad2deg, ועוזרי great-circle

  • Math::Complexext - מבצע overload ל־cos (ולשאר משפחת הטריגונומטריה) עבור ארגומנטים מרוכבים

  • POSIX - חושף את acos ישירות, בנוסף ל־isnan/isinf לזיהוי התוצאות הלא־סופיות שנדונו לעיל