C++ 三角函数返回意外值

c++ trigonometric function returns unexpected value

本文关键字:意外 返回 三角函数 C++      更新时间:2023-10-16

我被指派编写一个程序,该程序以度为单位的整数或浮点数作为输入,并返回该值的sincos,小数点后6位。但是当输入是 90 和 180 时,我得到奇怪的负零,而不是"正"零。

法典:

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
const double PI = 3.14159265;
int main() {
float x;
cin >> x;
x = x * PI / 180;
cout << fixed;
cout << setprecision(6) << sin(x);
cout << ' ' << setprecision(6) << cos(x) << endl;
}

不需要的输入和输出:

In:90 Out:1.000000 -0.000000
In:180 Out:-0.000000 -1.000000

我试图通过在输入为 1 时将 cos 函数的结果乘以 -90 来解决此问题,但它仍然输出 -0.000000。

溶液: 正如 @harold 和 @user2618142 指出的那样,计算结果为负数,因此近似值返回负 0。

让我们取接近 90 度的余弦,所以接近 pi/2 弧度。在该区域,余弦的行为类似于 cos(x( ≈ pi/2 - x。

因此,期望值是实际 pi 的一半(在其完整的无限位数精度中(和我们作为参数给出的"半pi"之间的差值。我们作为参数给出的半圆周率实际上不可能是真正的半圆周率,因为它会有无限个数字。所以已经很清楚,无论结果是什么,它绝对不是完全为零。

此处计算的实际值分步进行:

PI = 3.14159265 = 3.141592650000000208621031561051495373249053955078125
90 * PI = 282.74333849999999301871866919100284576416015625
90 * PI / 180 = 1.570796324999999882265910855494439601898193359375
(float)(90 * PI / 180) = 1.57079637050628662109375

最后,正如 WolframAlpha 将告诉我们的那样,pi/2 和该数字之间的差异约为 -4.371139000186243... × 10^-8,所以是负数。