【发布时间】:2013-12-12 04:22:13
【问题描述】:
我在一个空项目上对此进行了测试,没有发生。
如您所见,当我减去 bossPercentage 值时,newValue 变为 2.98023e-08。 这仅在 bossPercentage 为 0.2f 且 previous 值为 0.2f 时发生。 差值应该是 0.0f,但我不明白为什么我会得到 2.98023e-08。
作为参考,remainingBossPercentage 是 [GameController] 类中的一个属性,定义如下:
//header
@property (readwrite, nonatomic) float remainingBossPercentage;
//.m
@synthetize remainingBossPercentage;
//init
remainingBossPercentage=1.0f;
我想问你我可能在做什么导致这个错误。
编辑:我从剩余BossPercentage 中减去 0.2f(对于每个boss敌人),一切正常,直到我到达最后一个再次具有 0.2f 的敌人对象,并且我达到了 0.2f - 0.2f 的关键点(下面的屏幕截图)
编辑 2:我非常感谢所有 cmets 和答案,以及最后的投票。促使我提出这个问题的原因是 newValue 是 2.98023e-08。我现在看到还有比较问题(感谢投票关闭答案的人所链接的非常有用的 QA)。我想知道的是..为什么在我只有 2 个测试变量的新测试项目中不会发生这种情况?(我创建了一个减去两个浮点数的 HelloWorld 项目)。
我之所以问这个问题,是因为正如一位用户所建议的那样,理解浮点数而不走捷径很重要。是的,我问这个问题是走捷径,因为我今晚没有时间好好学习它,但我想尽我所能尝试理解和学习。我会正确阅读答案并花时间去理解,但如果同时可以,我想补充一个疑问:
可能是因为内存管理的原因,这两个项目(测试项目和我的实际游戏)表现不同吗? 两个项目的不同行为是否与脏区中的内存交换有某种联系?(例如,内存使用量较大的游戏交换得更多,因此可能会损失精度?)
PS:我发现了一个 question 与完全相同的 2.98023e-08 值。我仍然想知道为什么这不会发生在同一个测试项目中(我现在正在做更多的测试)。
【问题讨论】:
-
虽然这是一个合理的问题,但之前已经以多种形式提出过,并得到了很好的回答。请查看floating-point-gui.de 和此处的其他问题,不要期望浮点数是精确的。
-
唯一愚蠢的问题是你不问的问题。阅读,学习,不断提问。 .02
-
做一个测试项目(抱歉,无法添加答案以明确这一点):float c=1.0; c=c-.2;c=c-.2;c=c-.2;c=c-.2; CCLOG(@"%.12f",c);控制台应该记录 -> main : 0.200000032783 main : 0.000000000000
标签: ios cocos2d-iphone floating-point rounding-error