我已被分配编写一个程序,该程序以int或浮点数(度)为输入,并返回该值的sin
和cos
,并保留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
我试图通过在输入为90时将cos函数的结果乘以-1来解决此问题,但仍然输出-0.000000。
解决方案: 正如@harold和@ user2618142指出的那样,计算结果为负数,因此近似值返回负数0。
答案 0 :(得分:2)
让我们在90度附近取余弦,在pi / 2弧度附近。在该区域,余弦的行为类似于cos(x)≈pi / 2-x。
因此,期望值是实际pi 的一半(以其完整的无穷大数字精度)与我们作为参数给出的“半pi”之差。我们作为参数给出的一半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,因此为负。