我已经知道如何使用截断实现对半精度浮点的转换(感谢this answer)。但是,如何使用舍入法对最接近的可表示性进行相同的转换?例如,我希望65519舍入为0x7bff(即65504),而不是无穷大。再举一个例子:在链接的解决方案中,8199将由8192表示,但8199的最接近可表示值为8200
UPD::更多示例示例:我想将32768和65519之间的整数舍入为32的整数,将16384和32768之间的整数舍入为16的整数,依此类推。在此解决方案中,8199将由8192表示,但8199的最接近可表示值为8200
答案 0 :(得分:3)
您需要两件才能实现自己想要的。
1。在进行转换之前添加四舍五入
添加:
// round the number if necessary before we do the conversion
if (manbits > 13)
absx += (2<<(manbits-13));
manbits = 0;
tmp = absx;
while (tmp)
{
tmp >>= 1;
manbits++;
}
进行转换之前。
2。将剪贴画从无穷大更改为> 16
通过更改
if (exp + truncated > 15)
至:
if (exp + truncated > 16)
我更新了原始代码https://ideone.com/mWqgSP