Rumah >pembangunan bahagian belakang >C++ >Mengapakah Fungsi C/C \'s cos() dan sin() Menghasilkan Keputusan Tidak Dijangka untuk Sudut Sepunya Seperti 180 Darjah?

Mengapakah Fungsi C/C \'s cos() dan sin() Menghasilkan Keputusan Tidak Dijangka untuk Sudut Sepunya Seperti 180 Darjah?

Patricia Arquette
Patricia Arquetteasal
2024-11-27 12:00:16732semak imbas

Why Do C/C  's cos() and sin() Functions Produce Unexpected Results for Common Angles Like 180 Degrees?

Hasil Tidak Dijangka daripada C/C 's cos() dan sin() untuk Familiar Sudut

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:

  • dosa 0.0547
  • kos 0.99

Walau bagaimanapun, keputusan sebenar selalunya berbeza:

  • dosa daripada 3.5897934739308216e-009
  • kos -1.00000

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn