使用unsigned long long代替float来防止包装



我有一个应用程序,在这个应用程序中,我使用了一个特定的类,这个类有一个方法来返回当前经过的时间。

unsigned long long getCurrentElapsedTime(){
}
由于float在运行一定时间(~1小时)后会包裹(变为世博形式),所以在上述类中使用Unsigned long long代替float。早些时候,我使用类中的方法为我的程序返回秒(1.112,1.336等)的float
float getElapsedTime(){
}

我在我的程序中使用了上面的方法,如下所示:

float startTime, deltaTime;
starttime = getElapsedTime();
On Some event
deltaTime = getElapsedtime() - startTime;
if(deltaTime > 1.0f){
//do something
}

我现在有这个getCurrentElapsedTime()方法,它返回unsigned long long整数给我,直到很长一段时间才包装。我必须在我的应用程序中以类似的方式使用这种方法,我使用浮动,但我很困惑我应该如何将unsigned long long转换为float,这样我就不会得到指数格式的数字。对于我的应用程序,我之前使用的float具有以下格式数字(1.123,2.345,3.737等)

如果我有一个很长的unsigned long long数字,我试图转换为浮动,我可能会再次得到同样的问题(浮动将在世博形式)我该如何解决这个问题?在小数中是否有类似的东西,我可以从unsigned long long转换为没有包装问题?

Float不"change"为任何"expo to "。事实上,unsigned long long会在某个点溢出,并且换行回0。float则不会。如果您添加的增量太小,它将不再与之前的float值不同。浮点数是有损的,但它可以表示诸如"infinite"之类的值。长是无损的,但却是有限的。

可能是你的输出函数以一定的比例改变格式。但问题是你如何打印你的数字!

# Don't mind the python syntax, please:
print "Different format strings: %.3f %e %f" % (1.0, 1.0, 1.0)
Different format strings: 1.000 1.000000e+00 1.000000

相同的数字,不同的输出

然而,你的时间源是什么?使用时间源的原生类型(很可能是long)您不能仅仅通过将其转换为另一种类型来提高精度。

最新更新