Вы хотите преобразовать 32-битные числа с плавающей точкой в 16-битные целые числа с масштабированием.Однако в приведенном вами примере используется десятичное масштабирование, а не двоичное.Я не уверен, хотите ли вы продолжать работать в двоичном домене в системе без единицы с плавающей запятой или если вы действительно хотите преобразовать в десятичное представление числа.
Здесь я предполагаю, что ваша проблема заключается в том, чтоу вас нет доступа к инструкциям с плавающей запятой.Вы не указали язык программирования, поэтому я решил написать кое-что на C #.Язык прост в использовании, но, возможно, не самый подходящий для мелочей.Возможно, вам будет проще и эффективнее реализовать это, скажем, на C или C ++.
Поскольку я собираюсь продолжать использовать двоичное представление, шкала не может быть числом, подобным 10 или 100 (целая степень 10) но вместо этого он должен иметь целочисленную степень 2. Ниже приведен класс, который разбирает число двоичных чисел IEEE 754 с двоичным числом 32.
class Ieee754Binary32 {
public Ieee754Binary32(Single value) {
using (var memoryStream = new MemoryStream()) {
var binaryWriter = new BinaryWriter(memoryStream);
binaryWriter.Write(value);
memoryStream.Seek(0, SeekOrigin.Begin);
var binaryReader = new BinaryReader(memoryStream);
var bits = binaryReader.ReadInt32();
Fraction = bits & 0x7FFFFF;
Exponent = ((bits >> 23) & 0xFF) - 127;
Sign = (bits & 80000000) == 1 ? -1 : 1;
}
}
public Int32 Fraction { get; private set; }
public Int32 Exponent { get; private set; }
public Int32 Sign { get; private set; }
public Int16 ToScaledInt16(Int32 scaling) {
if (Exponent == -127 && Fraction == 0)
return 0;
var mantissa = 0x8000 | (Fraction >> 8);
var unscaledInt32 = Exponent >= 0 ? mantissa << Exponent : mantissa >> -Exponent;
var scaledInt16 = unscaledInt32 >> (15 - scaling);
return (Int16) (Sign*scaledInt16);
}
}
Метод ToScaledInt16
- это то, что вы хотите использовать.Если вы хотите выразить числа, используя дроби 8, вы должны указать значение 3
для scaling
.Все числа будут умножены на 2^3 = 8
, например, 0,125 = 1/8 преобразуется в 1, 0,25 = 2/8 в 2 и т. Д.
Код не обрабатывает более сложные вещи, такие как округление, NaN или переполнениено, возможно, вы можете использовать его в качестве отправной точки?