使用unsigned long long而不是float来防止包装

时间:2013-03-08 08:26:37

标签: c++ algorithm floating-point long-integer

我有一个应用程序,我正在使用某个类,它有一个方法可以将当前经过的时间返回给我。

unsigned long long getCurrentElapsedTime(){
}
在上面的类中使用

Unsigned long long代替float因为float在运行一段时间(~1小时)后换行(更改为expo表单)。 之前,我使用的是返回float秒(1.112,1.356等)的类中的方法。

float getElapsedTime(){
}

我在程序中使用上述方法如下:

float startTime, deltaTime;
starttime = getElapsedTime();

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

我现在有这个getCurrentElapsedTime()方法,它会向我返回unsigned long long整数,直到很长时间才会被包裹。 我必须在我的应用程序中使用此方法,类似于我使用float,但我很困惑我应该如何将unsigned long long转换为float,以便我不会获得指数格式数字。 对于我的应用程序,我之前使用的float具有以下格式数字(1.123,2.354,3.737等)

如果我有一个非常长的unsigned long long数字,我试图转换为浮点数,我可能会再次遇到同样的问题(并且浮点数将以展示形式) 我该如何解决这个问题?是否有类似的小数点,我可以转换为unsigned long long而不会陷入包装问题?

1 个答案:

答案 0 :(得分:0)

Float不会“改变”任何“expo fo”。事实上,unsigned long long会在某个时刻溢出并且换行会回到0. float不会。如果添加的增量太小,它将不再与之前的浮点值不同。浮点数是有损的,但它可以表示诸如“无限”之类的值。长期无损,但有限。

可能是您的输出功能以一定比例更改格式。但这是你打印你的数字的问题!

# 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)只是将其转换为其他类型,无法提高精度。