3D'射手'跳跃算法--C++低级别漏洞.当它们应该时,两个相同的双打彼此不相等.4.0!= 4.0显然

-4 c++ opengl floating-point

可能重复:
浮点比较

嗯,这是一个奇怪的.通常以下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.角色像火箭一样起飞,永远不会回到地面.即使将两个变量打印到标准输出并且相同,条件也永远不会成立.这是我想解决的问题,这很荒谬.

我不想要任何关于跳跃算法的反馈 - 请上面的段落.

请帮忙.

Cod*_*aos 5

这只是一个典型的浮点精度问题.特别是0.1无法使用二进制浮点精确表示.另一方面,像0.5和0.25这样的数字可以准确地表示,因此可能会起作用.我相信即使在这种情况下,编译器仍然可以自由地使它不起作用.

在您的情况下,解决方案正在使用>=:

if ascending && (currentJumpingHeight >= maximumJumpingHeight)
     ascending = false
     currentJumpingHeight = maximumJumpingHeight
Run Code Online (Sandbox Code Playgroud)

您也可以使用epsilon比较,但我尽可能避免使用它们.在你的情况下,简单>=似乎比epsilon平等更清晰.