C++ 铸造UINT64使其浮动?

C++ 铸造UINT64使其浮动?,c++,C++,将UINT64投射到浮子上安全吗?我意识到UINT64不包含小数,所以我的浮点数将是整数。但是,返回增量时间的函数返回UINT64,这对于我当前使用的函数来说不是一种非常有用的类型。我假设一个简单的静态转换(UINT64值)不起作用?如果将UINT64的大值(8字节的值)转换为只有4个字节的浮点值,可能会被截断。定义安全-如果64位值大,很容易丢失很多精度数字,但除此之外(这可能是一个你不介意的已知问题),转换应该是安全的。如果你的编译器不能正确处理它,那就找一个更好的编译器。为什么静态转换不能

将UINT64投射到浮子上安全吗?我意识到UINT64不包含小数,所以我的浮点数将是整数。但是,返回增量时间的函数返回UINT64,这对于我当前使用的函数来说不是一种非常有用的类型。我假设一个简单的静态转换(UINT64值)不起作用?

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

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

为什么静态转换不能工作

Max uint64 is 2^64 = 1.84467441 × 10^19
根据max,32位浮点是

9.999999×10^96.
应该工作…有问题吗


安全?安全是什么意思?就精度而言,IEEE-754
float
有一个23-(+1)位尾数。通过强制将64位值转换为“四舍五入”24位的值,您将在较宽的最低有效位范围内造成大量精度损失。这种损失在您的应用程序中可以接受吗?坦率地说,如果您的原始值真的使用了64位范围,将其强制为像
float
这样小的值对我来说不是一个好主意。

您可以尝试执行ar在
长双精度
双精度
中首先模拟:

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);
typedef长双实型
实型x=静态铸造(长1);
实际类型y=静态类型(长2);
实型z=x/y;
浮动结果=静态\u转换(实际\u类型);
经验法则:int可以从double来回转换 在float中来回转换是安全的,但是您将被限制为非常小的数字,大约1600万,如果超过允许的大小,您将悄悄地失去较低的精度。使用double,您可以使用更大的整数

假设采用IEEE 754基础浮点系统,您将能够准确地将23位的整数转换为浮点,并将52位转换为double。实际上,由于隐藏位的缘故,您可以在double中再获得一位,因此您可以在double中拟合最多包含1ffffffffffff或9007199254740991的整数。

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


事实上,JavaScript对每一个整数数字操作都是这样做的。说“浮点不准确”的人将问题大大简化了。

有效点。如果我们手动控制该值(我使用它来跟踪时间,因此它被限制在相对较小的值上),有可能进行此转换吗?当然。对于较小的值,应该没有问题。等等,但这是他询问的静态转换,不是重新解释或联合。对于小于2^24(16777216)的自然数,我迷路了,存在到32位浮点的一对一映射。如果它更大,则会丢失精度。最大值不是问题,而是精度。您不能接受64位数据类型并将其存储在32位数据类型中,而不会丢失精度(例如,能够分辨(2^64)-3和(2^64)-4之间的差异)这里有2 ^ 64可能的INT64。有2 ^ 32可能的浮点(实际上是因为所有的NANS和INFS)。我假设任何时候你都要把int转换成浮点,那么这个问题就被理解了。这个问题是UINT64特定的。不太确定你的意思是“to to and double”,但是在C和C++中,它只是“安全的”。如果double在范围内,则从double强制转换为int。将double>=int\u MAX+1强制转换为int是未定义的行为。当然,如果double是从int强制转换的结果,则满足此条件(嗯,我认为),因此可以“从double强制转换为int”,但你不一定能将一个双精度转换为整数,你也不一定能将一个整数转换为双精度,加上1,然后再转换回来。当然。我试图在答案中涵盖重要的内容,但总是很难知道要深入到细节中有多远……我想如果我只是用“往返”这个词,整个问题都会解决。谢谢,我可以编辑…@Steve:准确地说,将超大浮点值转换为整数类型是未定义的行为,而不是实现定义的行为behavior@AndreyT:谢谢,我查过了,一定是在你阅读/打字时替换了我的评论。