【问题标题】:c++ trigonometric function returns unexpected valuec ++三角函数返回意外值
【发布时间】:2018-08-13 19:02:34
【问题描述】:

我被分配编写一个程序,该程序以 int 或 float 作为输入,并返回该值的 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

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

解决方案: 正如@harold 和@user2618142 指出的那样,计算的结果是负数,所以近似返回负0。

【问题讨论】:

  • 请通过删除固定检查。可能确切的值是负数。
  • 是的,抱歉,已经看到并删除了评论。
  • @user2618142 删除 cout &lt;&lt; fixed; 输出 1 -4.37114e-08
  • 所以,这是您对查询的回答。希望这可以澄清!
  • 您可以查看stackoverflow.com/a/45795465/4014678 以了解更多关于为什么您得到负零的信息。

标签: c++ trigonometry


【解决方案1】:

让我们取接近 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,因此为负数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2013-06-26
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多