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מצמצם תחילה את הארגומנט שלו מודולו2π, ועבור|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- סינוס של זווית ברדיאנים; הפונקציה המלווה הנפוצה ביותר בשימוש לצדcosatan2- ארקטנגנס דו־ארגומנטי, אבן הבניין הרגילה לטריגונומטריה הפוכה (acos,asin) ב־Perl טהורsqrt- שורש ריבועי; מופיע בזהות הקלאסית שלacosacos(x) = atan2(sqrt(1 - x*x), x)Math::Trigext -acos,asin,atan, וריאנטים היפרבוליים,deg2rad/rad2deg, ועוזרי great-circleMath::Complexext - מבצע overload ל־cos(ולשאר משפחת הטריגונומטריה) עבור ארגומנטים מרוכביםPOSIX- חושף אתacosישירות, בנוסף ל־isnan/isinfלזיהוי התוצאות הלא־סופיות שנדונו לעיל