2012-12-12 148 views
5

可能重复:
getting value of sine 180 as 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); 

谁能帮助我?

+1

邮政编码请。 – pdriegen

+1

为什么这个标签为“objective-c”? –

回答

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不能完全表示为floatdouble

从您的输出我假设你使用float。 由于float的有效数字位数约为7,因此该点的sin()cos()的斜率(一阶导数)为+/- 1,我会说结果与您预期的一样好。使用double会得到更好的结果,但不完全为零。

所以没有什么认真错了,你只是不能指望浮点运算的结果是准确的。

+0

那么你们建议什么,不使用浮动。 我使用哪些数据类型?因为,当我计算45度时,它计算得非常好。 应该做些什么来获得确切的结果? – Kunjal

+0

@Kunjal:结果*是精确的*在浮点精度内。三角函数的浮点也没有其他选择。 - 如果你只是想显示一些点,那么这完全没有问题,因为结果无论如何都会四舍五入为像素。 - 否则,你必须更清楚地说明你对结果做了什么,以及为什么结果对你来说是一个问题。 –

+0

有一个圆圈,我需要在圆的圆周上以不同的角度放置按钮。 当我使用我原来的问题中提到的公式时,我得到的结果将需要被操纵。如果我能得到确切的结果,那么它总是更好地制作一个CGPoint。 我希望事情很清楚。 – Kunjal

0

通常用浮漂它不advisabe到结果(等于)与任何特定数量的比较处理的情况下,可以由为0,1或甚至PI或电子邮件。 -8.74228e-08已经足够接近,在实际上所有可计算的情况下都被视为0。 (如果没有,那么你有一个浮点数/双精度问题)

如果你需要在程序代码中比较它们,你应该减去这些值并将结果与​​<或>和一些非常相似少数。例如

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

而不是

if (sin(something*pi) == 0) ... 
1

添加注释到duplicate问题...

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

另外一个具有惊叹数学库的一些实施方式如何处理pi的倍数:如在浮筒的pI的表示或由一些小的量增量从真值加倍是关闭的,那么它遵循N * (pi + -delta)与真值相差N * delta。因此,在一个写得很好的库中,sin((pi/2)+(2 * pi)* n)随着n增加;如果文档写得不好,则参数将以2 * pi的近似值近似为进行评估,从而给出每个完全相同的偏移量。

+0

你确实提到的问题是java。对Objective-C的同样工作吗?另外,我不确定Objective-C是否允许以梯度或度数进行计算 – Kunjal

+0

浮点算术或多或少是独立于语言的 - 也就是将圆划分为整数个扇区的艺术。后者可能仅在有限的情况下有用,并且在查找表中执行三角函数。 –