【发布时间】:2015-09-27 17:11:35
【问题描述】:
我正在编写一个协议,它使用RFC 7049 作为其二进制表示。标准规定,如果它们的数值等于相应的 64 位数字,则协议可以使用数字的 32 位浮点表示。转换不得导致精度损失。
- 哪些 32 位浮点数可以大于 64 位整数并在数值上与它们等价?
- 比较
float x; uint64_t y; (float)x == (float)y是否足以确保值相等?这种比较会成立吗?
就本规范而言,所有数字表示 对于相同的数值是等价的。这意味着一个 编码器可以将浮点值 0.0 编码为整数 0。 但是,这也意味着期望找到的应用程序 如果编码器,整数值只能找到浮点值 决定这些是可取的,例如当浮点值是 比 64 位整数更紧凑。
【问题讨论】:
-
What 32-bit float numbers can be bigger than 64-bit integer and numerically equivalent with them?无:根据定义,等于Y的数字X不能大于Y。 -
只要 32 位浮点数是整数值,将其转换为 64 位整数就不会丢失精度。但是如果原来的浮点数不是整数,就会失去精度。
-
当然这个比较可能是真的。
1.0f == float(1ull) -
这个问题只有在关于哪些 64 位整数可以表示为浮点数而不损失精度时才有意义。这也是第一段所说的,第一个要点相当混乱。并且显然有相当多的数字对于这个属性是正确的(任何大于 2^32 但小于 2^64 的 2 的幂)。
-
重要的检查是这个。如果取原来的 64 位整数值,将其转换为浮点数,然后将该浮点数转换回整数,并得到原始值,则可以传输浮点数代替整数;你可以确定对方可以恢复原来的整数(因为你刚刚自己测试过)。
标签: c++ floating-point cbor