从 16 位半精度浮点格式到十进制的转换过程中出现了一些精度错误。它能够准确地转换某些数字,同时对其他数字不准确。
该代码最初设计用于 32 位单精度浮点到十进制的转换。因此,我尝试对其进行编辑以适应 16 位半精度浮点格式。结果,获得的最终值最终是预期值的一半。
例如。期望值是1800
,结果是900
。
因此,我决定* 2
在最后的操作中添加一个。我不确定如何修复当前的精度误差,以及为什么结果也是预期值的一半。
下面包括我用各自的结果编辑的代码。
#include <stdio.h>
//#include <bits/stdc++.h>
#include <string>
#include <iostream>
#include <sstream>
#include <math.h>
#include <limits.h>
#include <bitset>
using namespace std;
// Convert the 16-bit binary encoding into hexadecimal
int Binary2Hex( std::string Binary )
{
std::bitset<16> set(Binary);
int hex = set.to_ulong();
return hex;
}
// Convert the 16-bit binary into the decimal
float GetFloat16( std::string Binary )
{
int HexNumber = Binary2Hex( Binary );
printf("Test: %d\n", HexNumber);
bool negative = !!(HexNumber & 0x8000);
int exponent = (HexNumber & 0xf800) >> 10;
int sign = negative ? -1 : 1;
// Subtract 15 from the exponent
exponent -= 15;
// Convert the mantissa into decimal using the
// last 10 bits
int power = -1;
float total = 0.0;
for ( int i = 0; i < 10; i++ )
{
int c = Binary[ i + 6 ] - '0';
total += (float) c * (float) pow( 2.0, power );
power--;
}
total += 1.0;
float value = sign * (float) pow( 2.0, exponent ) * total * 2;
}
我使用的 16 位浮点值是:0101010100010011
预期结果:81.2
实际结果:81.1875