Rumah >pembangunan bahagian belakang >C++ >Mengapakah Fungsi C/C \'s cos() dan sin() Menghasilkan Keputusan Tidak Dijangka untuk Sudut Sepunya Seperti 180 Darjah?
Apabila menggunakan sudut 180 darjah pada C/C 's cos () dan sin() berfungsi, hasil yang salah mungkin timbul. Ini mungkin mengejutkan kerana kami menjangkakan keputusannya ialah:
Walau bagaimanapun, keputusan sebenar selalunya berbeza:
Percanggahan ini berpunca daripada fakta bahawa cos(a), sin(a), dan tan(a) berfungsi dalam C/C mengharapkan radian sebagai hujah, bukan darjah. Penukaran daripada 180 darjah kepada radian kadangkala boleh memperkenalkan anggaran.
Walaupun dengan pengiraan radian yang betul, keputusan mungkin masih menyimpang disebabkan oleh ketepatan terhingga dua kali ganda dan kemungkinan salah nyataan PI.
Untuk menangani perkara ini, sebaiknya kurangkan hujah dalam darjah sebelum menggunakan fungsi trig. Dengan mengehadkan sudut kepada antara -45° dan 45°, kami memastikan ketepatan hasil.
Sebagai contoh, pertimbangkan kod berikut, yang mengira sin() dalam darjah menggunakan pengurangan hujah:
#include <math.h> #include <stdio.h> static double d2r(double d) { return (d / 180.0) * ((double) M_PI); } double sind(double x) { if (!isfinite(x)) { return sin(x); } if (x < 0.0) { return -sind(-x); } int quo; double x90 = remquo(fabs(x), 90.0, &quo); switch (quo % 4) { case 0: // Use * 1.0 to avoid -0.0 return sin(d2r(x90)* 1.0); case 1: return cos(d2r(x90)); case 2: return sin(d2r(-x90) * 1.0); case 3: return -cos(d2r(x90)); } return 0.0; } int main(void) { int i; for (i = -360; i <= 360; i += 15) { printf("sin() of %.1f degrees is % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1, sin(d2r(i))); printf("sind() of %.1f degrees is % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1, sind(i)); } return 0; }
Kod ini menjana hasil yang lebih tepat daripada pendekatan asal, terutamanya untuk nilai pada pelbagai sudut, kerana ia melakukan pengurangan hujah sebelum memanggil trig fungsi.
Atas ialah kandungan terperinci Mengapakah Fungsi C/C \'s cos() dan sin() Menghasilkan Keputusan Tidak Dijangka untuk Sudut Sepunya Seperti 180 Darjah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!