可能重复:
浮点比较
嗯,这是一个奇怪的.通常以下if( 4.0 == 4.0 ){return true}将永远返回true.在一个简单的小型opengl 3d'射手'程序中,当我试图添加"跳跃"效果时,情况并非如此.
这个想法相当简单,我有一个三角形条带的地形,因为"角色"移动/走动你沿着一个2d阵列的高度移动,因此你在山丘/低谷的各个高度上下走动.
在drawScene()函数之外(或者如果你知道opengl,那么glutDisplayFunc()),我有一个update()函数,当他'跳'时,它会上升和下调字符,这就是调用drawScene().用语言来说,我可以解释它的高级别,跳跃算法如下:
参数:
double currentJumpingHeight
double maximumJumpingHeight = 4.0
double ypos;
const double jumpingIncrement = 0.1; //THE PROBLEM!!!! HAS TO BE A MULTIPLE OF 0.5!!
bool isJumping = false;
bool ascending = true;
Run Code Online (Sandbox Code Playgroud)
算法:
(when space is pressed) isJumping = true.
if ascending = true and isJumping = true,
currentJumpHeight += jumpingIncrement (and the same for ypos)
if currentJumpingHeight == maximumJumpingHeight, //THE PROBLEM
ascending = false
(we decrement currentJumpingHeight and start to fall until we hit the ground.)
Run Code Online (Sandbox Code Playgroud)
它非常简单,但只有在JumpIncrement是多个0.5!!时才能工作!
如果jumpingIncrement是,0.1那么,那么currentJumpingHeight永远不会平等maximumJumpingHeight.角色像火箭一样起飞,永远不会回到地面.即使将两个变量打印到标准输出并且相同,条件也永远不会成立.这是我想解决的问题,这很荒谬.
我不想要任何关于跳跃算法的反馈 - 请上面的段落.
请帮忙.
这只是一个典型的浮点精度问题.特别是0.1无法使用二进制浮点精确表示.另一方面,像0.5和0.25这样的数字可以准确地表示,因此可能会起作用.我相信即使在这种情况下,编译器仍然可以自由地使它不起作用.
在您的情况下,解决方案正在使用>=:
if ascending && (currentJumpingHeight >= maximumJumpingHeight)
ascending = false
currentJumpingHeight = maximumJumpingHeight
Run Code Online (Sandbox Code Playgroud)
您也可以使用epsilon比较,但我尽可能避免使用它们.在你的情况下,简单>=似乎比epsilon平等更清晰.
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |