gpt4 book ai didi

c++ - 比较 uint64_t 和 float 的数值等价性

转载 作者:太空狗 更新时间:2023-10-29 23:00:47 25 4
gpt4 key购买 nike

我正在编写一个使用 RFC 7049 的协议(protocol)作为其二进制表示。该标准规定,协议(protocol)可以使用数字的 32 位浮点表示,如果它们的数值等于相应的 64 位数字。转换不得导致精度丢失。

  • 哪些 32 位 float 可以大于 64 位整数并且在数值上与它们相等?
  • 正在比较float x; uint64_t y; (float)x == (float)y 足以确保这些值是等效的?这种比较会是真的吗?

RFC 7049 §3.6. Numbers

For the purposes of this specification, all number representationsfor the same numeric value are equivalent. This means that anencoder can encode a floating-point value of 0.0 as the integer 0.It, however, also means that an application that expects to findinteger values only might find floating-point values if the encoderdecides these are desirable, such as when the floating-point value ismore compact than a 64-bit integer.

最佳答案

肯定有一些数字是正确的:

2^33可以完美表示为 float ,但显然不能表示为32位整数。以下代码应按预期工作:

bool representable_as_float(int64_t value) {
float repr = value;
return repr >= -0x1.0p63 && repr < 0x1.0p63 && (int64_t)repr == value;
}

重要的是要注意,虽然我们基本上是在做 (int64_t)(float)value 而不是相反的方式——如果转换为 float 会丢失任何精度,我们会感兴趣。

检查 repr 是否小于 int64_t 的最大值很重要,否则我们可能会调用未定义的行为,因为转换为 float 可能会四舍五入到下一个更高的数字(然后可能会大于最大值可能在 int64_t 中)。 (感谢@tmyklebu 指出这一点)。

两个样本:

// powers of 2 can easily be represented
assert(representable_as_float(((int64_t)1) << 33));
// Other numbers not so much:
assert(!representable_as_float(std::numeric_limits<int64_t>::max()));

关于c++ - 比较 uint64_t 和 float 的数值等价性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32810583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com