如何以float32(https://en.wikipedia.org/wiki/Half-precision_floating-point_format)格式保存float16(https://en.wikipedia.org/wiki/Single-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
答案 0 :(得分:2)
<script type="text/javascript">
$(document).ready(function (e) {
$.get('@Url.Action("Calendar","Home")', {}, function (result) {
$("#calendarDiv").load("~/Home/Calendar");
});
});
答案 1 :(得分:1)
通过非常声明float fp16_max
,您的值已经是32位浮点数;不需要在这里投。我想你可以简单地:
float i = fp16_max;
这里的假设是您的“魔术” bit_cast
函数已经正确返回了32位浮点数。由于您没有向我们展示bit-cast
的作用或实际返回的内容,因此我认为它确实返回了正确的float
值。
答案 2 :(得分:1)
如何以float32格式保存float16的最大值?
65504
您可以简单地将整数转换为浮点数:
float half_max = 65504;
如果要计算值,可以使用ldexpf
:
float half_max = (2 - ldexpf(1, -10)) * ldexpf(1, 15)
或者通常,对于任何IEEE float:
// in case of half float
int bits = 16;
int man_bits = 10;
// the calculation
int exp_bits = bits - man_bits - 1;
int exp_max = (1 << (exp_bits - 1)) - 1;
long double max = (2 - ldexp(1, -1 * man_bits)) * ldexp(1, exp_max);
位转换0x7bff不起作用,因为0x7bff是二进制16格式(以某种字节序)的表示形式,而不是二进制32格式的表示形式。您不能偏向转换有冲突的表示形式。