这是我没有想到的。我知道这些数字是不准确100%,但我没想到余角给人sin
不同的结果和cos
:为什么sin(45)和cos(45)给出不同的结果?
这下面的函数返回0.70710678118654746000000...
sin(45 * PI/180.0);
而这follwing函数返回0.70710678118654757000000...
cos(45 * PI/180.0);
所以,它的:
0.707106781186547**46**000000... vs
0.707106781186547**57**000000...
而不仅仅是... sin(1 * PI/180.0)
也返回比cos(89 * PI/180.0)
略有不同数量虽然他们应该是相同的。
而且这不仅是一个sin
VS cos
问题,它也是一个sin
VS sin
问题:sin(1 * PI/180.0)
比sin(179 * PI/180.0)
返回不同的值,他们又应该是相同的。
我试图用弧度,而不是学位,并有完全一样的区别,我试图用一个小的PI值,一个巨大的PI值(约100个小数和更多),他们还在不同的,我试过使用cmath
而不是math.h
,我试图使用M_PI
而不是我自己定义的PI
。
其差值总是相同的,大约在小数点后16位。不要误解我的意思,我知道我永远不会得到这些数字的100%精确值,但至少我期望得到相互补充角度的sin
和cos
相同的“不精确”值。这一切到底是什么错误?
我需要他们一样,因为我的工作(重力模拟器我被要求做)的程序使用具有double
(我也试过float
)对象它们基本上角度变量(度或弧度,我都试过)。这些是物体移动的方向,也需要角度来计算物体之间的相互作用。
在程序的每一次迭代中角度都会改变,并且在每次迭代中,角度都会根据前一次迭代角度的计算而改变,所以如果在任何一点上有任何最小错误的角度值,该误差会被放大得更多并在每一次迭代中更多。
该程序运行数千甚至数百万次的迭代,所以该值的错误变得荒谬可笑!说得清楚,行星最终得到了他们的平衡,一切都变得一场灾难,我真的疯了:(
附言:我在Windows 7中,32位。
这里只有约16的精度十进制数字在编译双倍。 – ooga
嗯,我知道我永远不会为罪(45)获得完美的价值,这样的价值不存在,完美的圆形PI值也不存在,但我至少期待互补的角度出错以相同的方式:/ – Dimakhaerus
您可能想要查找(或实现)符号计算库。当然,你会为了精确而牺牲性能。 –