1

从 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

4

0 回答 0