将UINT64转换为浮动?

时间:2009-11-17 01:17:42

标签: c++

将UINT64转换为浮点数是否安全?我意识到UINT64不包含小数,所以我的浮点数将是整数。但是,我返回delta-time的函数返回一个UINT64,这对我目前正在使用的函数来说不是一个非常有用的类型。我假设一个简单的static_cast< float>(uint64value)不起作用?

6 个答案:

答案 0 :(得分:4)

定义安全 - 如果64位值很大,您很容易丢失很多精度数字,但除此之外(可能是您不介意的已知问题),转换应该是安全的。如果您的编译器没有正确处理它,请获得更好的编译器。

答案 1 :(得分:3)

UINT64的大值(8字节值)如果将它们转换为浮点数(可能只有4个字节),则可能会被截断。

答案 2 :(得分:2)

您可以尝试先在long doubledouble执行算术:

typedef long double real_type
real_type x = static_cast<real_type>(long1);
real_type y = static_cast<real_type>(long2);

real_type z = x / y;
float result = static_cast<float>(real_type);

答案 3 :(得分:1)

经验法则:int可以从双重

转换为

从浮动中投射和投射是安全的,但是你将被限制在相当小的数字,大约1600万,如果超过允许的幅度,你将默默地失去低阶精度。使用double,可以使用更大的整数。

假设有一个IEEE 754基础浮点系统,您将能够准确地将 23位的整数与float和 52位进行精确投射,以及从双投射。实际上,由于隐藏位,你得到一位,所以你可以在一个双精度数中加入一个整数,包括1FFFFFFFFFFFFF或9007199254740991。

因此每个32位整数都具有double的精确表示;它可以安全地转换回来,对它们的普通算术运算将产生精确的结果。

实际上,这就是JavaScript为每个整数运算所做的事情。那些说“浮点不准确”的人大肆过分简化。

答案 4 :(得分:0)

安全吗?安全是什么意思?就精度而言,IEEE-754 float具有23 - (+ 1)位尾数。通过将64位值强制转换为“舍入”24位值,您将在广泛的最低有效位中造成大量精度损失。您的申请中是否可以接受此损失?坦率地说,如果你的原始值真的使用了64位范围,那么将它强制到像float一样小的东西对我来说听起来不是一个好主意。

答案 5 :(得分:-1)

为什么static_cast不起作用?

Max uint64 is 2^64 = 1.84467441 × 10^19

根据this最大32位浮点数

9.999999×10^96.

应该工作......有问题吗?

http://en.wikipedia.org/wiki/Decimal32_floating-point_format