C++ 三角函数返回意外值
c++ trigonometric function returns unexpected value
我被指派编写一个程序,该程序以度为单位的整数或浮点数作为输入,并返回该值的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
我试图通过在输入为 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,所以是负数。
相关文章:
- 三元运算符在返回语句中给出意外的结果
- QT 和 JIRA Rest API: /rest/api/2/issue/createmeta 意外返回韩语的 iss
- 为什么这会返回意外值?
- 从 C++ 调用 cURL 命令会返回意外的错误代码,如 1792 和 6656
- C++ 三角函数返回意外值
- 裸__declspec上的 memcpy 返回意外的字节
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 在C 中读取二进制文件会返回意外值
- 在 winapi 回调函数上返回 FALSE 时出现意外行为(循环被跳过?
- 从函数的返回值将元素C++存储到 std::vector 中时出现意外结果
- OpenCL - 内核方法返回意外结果
- system() 返回错误语法错误:"("意外
- 从指针返回对象时出现意外的析构函数调用
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- C :Bool方法在COUT语句之后返回意外数字
- 文件设置正确,但eof()和peek()意外地从新流返回了错误的值
- 用户定义的功能的意外返回值
- VS2012 std::函数运算符 bool 意外返回 true
- GCC优化导致意外返回值
- 意外返回主函数和排序字符串函数