C ++数学库的三角函数的结果不正确

时间:2011-11-20 18:24:09

标签: c++ trigonometry cmath

我目前正在做一个我已经做了将近一年的个人项目。我正在尝试将其移植到Windows环境中,该环境已成功完成。因为我试图尽快将Windows版本发布给人们,所以我决定继续在Windows中开发,同时尝试添加新功能并获取已存在数月的错误。虽然最近尝试添加严重依赖于三角函数的功能,但我发现无论我传递的参数如何,奇怪的是,所有3个三角函数都返回相同的值(1072693887)。可以想象,这导致了系统中一些相当奇怪的错误。

我包含math.h,据我所知,没有其他文件包含此功能。 (也许有一个调试器命令来查找符号的定义位置?我找不到任何这样的东西,但也许我错过了一些东西。)我试过去别的地方搜索并在Google上搜索,但无济于事...... < / p>

之前有没有其他人听说过这个问题,或者知道如何修复它?

4 个答案:

答案 0 :(得分:5)

编辑:此答案无关紧要。见评论。


这可能是由于数字不稳定造成的。

当您将如此大的值传递到sin()cos()或任何周期性触发函数时,您必须记住2*pi有一个隐式模数。

如果您使用float,那么1072693887的不确定性将超过2*pi。因此,无论你得到什么结果都是垃圾。

我们需要看一些代码才能确切地看到发生了什么。

编辑:以下是插图:

sin(1072693886) =  0.6783204666
sin(1072693887) = -0.2517863119
sin(1072693888) = -0.9504019164

但如果数据类型为float,则1072693887的不确定性为+/- ~64 ...

答案 1 :(得分:2)

1072693887是十六进制的3FF207FF,在IEEE单精度浮点中表示1.8908690。你确定你的问题不只是一个表示问题,即你是在铸造或以整数形式查看结果吗?

答案 2 :(得分:0)

数学库很好。

你意识到函数期望弧度作为输入吗?

E.g。 :

double param = 90.0;
double rads = param * M_PI/180;
std::cout << std::fixed << "Angle : " << param << " sin : " << sin (rads) << " cos " << cos(rads);

输出:

Angle : 90.000000 sin : 1.000000 cos 0.000000-0.304811

答案 3 :(得分:0)

  

我所知道的是,GDB告诉我它的结果是1072693887,它发生在我的所有3个trig函数中(并且所有三个函数的弧版本只返回-1072693887),无论我使用什么参数通过。

可能是GDB问题。如果只是手动将值打印到控制台会发生什么?