将float16最大数量保存在float32中

时间:2019-07-11 17:52:26

标签: c++ floating-point

如何以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

3 个答案:

答案 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格式的表示形式。您不能偏向转换有冲突的表示形式。