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位数字.

上一篇:圆锥曲线:椭圆小题解题报告


下一篇:2021-10-18