【发布时间】:2019-11-21 12:11:26
【问题描述】:
如何以 float32 (https://en.wikipedia.org/wiki/Single-precision_floating-point_format) 格式保存 float16 (https://en.wikipedia.org/wiki/Half-precision_floating-point_format) 最大值?
我想要一个可以将 0x7bff 转换为 65504 的函数。0x7bff 是可以用浮点半精度表示的最大值:
0 11110 1111111111 -> decimal value: 65504
我想让 0x7bff 代表我程序中的实际位。
float fp16_max = bit_cast(0x7bff);
# want "std::cout << fp16_max" to be 65504
我试图实现这样的功能,但它似乎不起作用:
float bit_cast (uint32_t fp16_bits) {
float i;
memcpy(&i, &fp16_bits, 4);
return i;
}
float test = bit_cast(0x7bff);
# print out test: 4.44814e-41
【问题讨论】:
-
不要使用
memcpy,而是重新分配。浮点格式大相径庭。 -
我很确定@tadman 是正确的。您为规避该分配而尝试做的任何事情都可能会减慢或破坏它。
-
@Lemon 我不确定,但我认为你把事情搞混了。我也这样做,所以这可能不准确:
float a是你的lvalue接收0x7bff的结果,它是一个整数。这个文字将被编译器翻译成它可以做到的最好的(31743 点),适合你的float。floats 无法表示每个整数。如果我退后一步,看看你的问题,看看“保存”。您需要将此保存的数据带到任何地方吗?它是否只需要在您保存它的同一台计算机上进行解释?如果是这样,那就有点简单了。 -
很抱歉给您带来了困惑。它发生在同一台计算机上,无需前往任何地方。
标签: c++ floating-point