首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:余弦错了,应该是零。3 3Pi/2

C++:余弦错了,应该是零。3 3Pi/2
EN

Stack Overflow用户
提问于 2014-03-24 02:36:20
回答 3查看 353关注 0票数 2

我有一个程序,我正在计算cos(M_PI*3/2),而不是像我应该得到的那样得到0,我得到-1.83691e-016

我在这里错过了什么?我像我所需要的那样有弧度。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-24 02:55:09

首先,M_PI不是一个非常可移植的宏,通常大约小数点15位,这取决于您使用的编译器--我猜您使用的是微软的C++编译器。

第二,如果您想要一个更精确(且可移植的)版本,请使用Boost数学库:templ.html

第三,正如Kay所指出的,pi本身就是一个无理数,因此,任何数量的位(或基数10中的数字)都不足以准确地表示它。因此,实际上计算的不是cos(3 * pi /2 ),而是“给定所需位的最接近π的3/2倍余弦”,它不会是3*pi/2,因此不会是零。

最后,如果您想要数学常数的自定义精度,请阅读以下内容:def.html

票数 5
EN

Stack Overflow用户

发布于 2014-03-24 02:39:17

M_PI数只是π的一个近似。你得到的余弦也是一个近似,这是一个很好的,它在小数点之后有15个正确的数字。

票数 5
EN

Stack Overflow用户

发布于 2014-03-24 02:54:21

考虑到double值的离散性,检验数值相等性的标准误差范围是numeric_limits<double>::epsilon()

代码语言:javascript
复制
#include <iostream>
#include <limits>
#include <cmath>

using namespace std;

int main()
{
  double x = cos(M_PI*3/2);
  cout << "x = << " << x << endl;
  cout << "numeric_limits<double>::epsilon() = "
       << numeric_limits<double>::epsilon() << endl;
  cout << "Is x sufficiently close to 0? "
       << (abs(x) < numeric_limits<double>::epsilon() ? "yes" : "no") << endl;
  return 0;
}

输出:

代码语言:javascript
复制
x = << -1.83697e-16
numeric_limits<double>::epsilon() = 2.22045e-16
Is x sufficiently close to 0? yes

如您所见,-1.83697e-16的绝对值在epsilon 2.22045e-16给出的误差范围内。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22600162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档