我有一个程序,我正在计算cos(M_PI*3/2),而不是像我应该得到的那样得到0,我得到-1.83691e-016
我在这里错过了什么?我像我所需要的那样有弧度。
发布于 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
发布于 2014-03-24 02:39:17
M_PI数只是π的一个近似。你得到的余弦也是一个近似,这是一个很好的,它在小数点之后有15个正确的数字。
发布于 2014-03-24 02:54:21
考虑到double值的离散性,检验数值相等性的标准误差范围是numeric_limits<double>::epsilon()。
#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;
}输出:
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给出的误差范围内。
https://stackoverflow.com/questions/22600162
复制相似问题