Ошибка точности преобразования при преобразовании с плавающей точкой половинной точности IEE в десятичную

У меня есть некоторые ошибки точности при преобразовании из 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

0 ответов

Другие вопросы по тегам