使用unsigned long long代替float来防止包装
Using unsigned long long instead of float to prevent wrapping
我有一个应用程序,在这个应用程序中,我使用了一个特定的类,这个类有一个方法来返回当前经过的时间。
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
)您不能仅仅通过将其转换为另一种类型来提高精度。
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 包装C++类时不完整的类型 GLFWwindow
- 使用unsigned long long代替float来防止包装