5

可能重复:
将正弦 180 的值设为 1.22465e-16

我正在计算圆周上的一个点。我有圆的半径和中心点。在这里你会说,重要的是,有一个相同的直接公式。是的,角度是弧度

x = x + r*sin(angle)
y = y + r*cos(angle)

好的,现在这里的问题是即使我以弧度传递角度。然而,对于下面提到的角度,我没有得到正确的答案

for 90 degree (rads = 1.5708) i get y axis = -4.3774e-08
for 180 degree (rads = 3.14159) i get x axis = -8.74228e-08
for 270 degree (rads = 4.71239) i get y axis = 1.19249e-08
for 360 degree (rads = 6.28319) i get x asix = 1.74846e-07

我正在将度数转换为弧度

return degrees * M_PI / 180;

我不确定为什么会这样。一定有什么严重的错误。

这是用于转换的代码

float angle = DegreesToRadians(90);

float x = sin(angle);
float y = cos(angle);

谁能帮我这个?

4

3 回答 3

8

M_PI在“math.h”中定义为

#define M_PI        3.14159265358979323846264338327950288

这只是大约(无理数)Pi。所以

cos(M_PI/2), sin(M_PI), cos(3*M_PI/2), sin(2*M_PI)

接近于零。Pi 不能完全表示为 afloatdouble

根据您的输出,我假设您使用了float. 由于 a 的有效位数float约为 7,并且sin()cos()在该点的斜率(一阶导数)为+/- 1,因此我会说结果与您预期的一样好。使用double会产生更好的结果,但不完全为零。

所以没有什么严重的错误,你不能指望浮点计算的结果是准确的。

于 2012-12-12T18:33:07.297 回答
1

要为重复的问题添加评论...

一种替代方法是使用梯度或度数而不是弧度,这样整个圆的倍数以及每个象限的倍数都是整数,并且这些参数的正弦和余弦也可以精确表示。

还必须惊叹一些数学库的实现如何处理 pi 的倍数:由于浮点数或双精度数中 pi 的表示与真实值相差一些delta,因此 N*(pi+-delta) 是偏离真实值 N*delta。因此,在编写良好的库中,sin((pi/2)+(2*pi)*n) 随 n 增加;对于编写不佳的库,该参数被评估为 2*pi 的模逼近,为每个n给出完全相同的偏移量。

于 2012-12-13T15:33:18.357 回答
0

一般来说,在处理浮点数时,不建议将结果(相等)与任何特定数字进行比较,可能是 0、1 甚至 pi 或 e。-8.74228e-08 非常接近,几乎可以在所有可计算的情况下被视为 0。(如果不是,那么无论如何你都有浮点/双精度的重要问题)

如果您需要在程序代码中比较它们,您应该减去这些值并将结果与​​ < 或 > 以及一些非常小的数字进行比较。例如

if (sin(something*pi) < 0.0001f) ...

而不是

if (sin(something*pi) == 0) ...
于 2012-12-12T19:03:26.837 回答