Ошибка точности преобразования при преобразовании с плавающей точкой половинной точности 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