c – 为什么sin(45)和cos(45)给出不同的结果?
作者:互联网
参见英文答案 > Is floating point math broken? 30个
这是我没想到的.我知道这些数字不是100%准确,但我没想到互补的角度给出了不同的罪和余的结果:
以下函数返回0.70710678118654746000000 …
sin(45 * PI / 180.0);
而这个follwing函数返回0.70710678118654757000000 …
cos(45 * PI / 180.0);
所以是:
0.707106781186547**46**000000... vs
0.707106781186547**57**000000...
而且不仅那些……罪(1 * PI / 180.0)也会返回与cos(89 * PI / 180.0)略有不同的数字,尽管它们应该是相同的.
此外,它不仅是一个罪恶与cos的问题,它也是一个罪与罪的问题:sin(1 * PI / 180.0)返回的值不同于sin(179 * PI / 180.0),它们应该是相同的.
我尝试使用弧度而不是度数,并且存在完全相同的差异,我尝试使用小的PI值,一个巨大的PI值(大约100个小数点以上)并且它们仍然不同,我尝试使用cmath代替math.h,我尝试使用M_PI而不是我自己定义的PI.
差值总是相同的,大约是十六进制小数.不要误会我的意思,我知道我永远不会得到这些数字的100%精确值,但至少我期望获得相同的“不精确”的sin值和互补角度的cos值.这一切到底是怎么回事?
我需要它们是相同的,因为我正在处理的程序(我被要求做的重力模拟器)使用具有双重(我也尝试浮动)变量的对象,这些变量基本上是角度(度或弧度,我试过都).这些是物体用来移动的方向,我也需要角度来计算物体之间的相互作用.
角度在程序的每次迭代中都会发生变化,并且在每次迭代中,角度都会根据前一次迭代角度的计算而变化,因此如果在任何点上存在任何最小错误的角度值,则该误差会在每次迭代中越来越大.迭代.
该程序运行数千甚至数百万次迭代,因此值的误差非常大!说清楚,行星最终摆脱了平衡,一切都变成了灾难,我真的很生气:(
附:我在Windows 7,32位.
解决方法:
I know I will never get a 100% precise value of these numbers, but AT
LEAST I was expecting to get the same “unprecise” value of sin and cos
of complementary angles.
为什么?计算方式不同,因此会出现(并累积)不同的浮点错误.你看到的不是错误; FP算法不能通过数学定律预测.
顺便说一句,提供例如. PI的30或100位数字不会有任何不同
如果您的类型首先不能容纳30位数字.
标签:pi,angle,c,trigonometry 来源: https://codeday.me/bug/20191002/1841781.html