Определить двоичные цифры

У меня есть несколько коэффициентов типа double, которые должны храниться в FPGA как 16-битные числа со знаком. Для этого мне нужно настроить, сколько битов 16 бит должно быть использовано для дроби и сколько для целой части. Таким образом, идея состоит в том, что я ищу в своем массиве с коэффициентами, беру целую часть и вычисляю, сколько битов потребуется для его представления. Я делаю это до самого большого коэффициента.

Это мой код до сих пор:

double value;
int value_intpart;
double value_array[] = {0.33333333333333333, 0.67676767676767676, -0.67676767676767777, 1.1111111111111111, 2.3654375346357653, -2.3658375346397653, 10.365437534635765};
for(int counter = 0; counter < 7; counter++)
{
value = value_array[counter];
value_intpart = floor(abs(value) + 1);

std::cout << "Value: " << value << std::endl;
if(abs(value) > max_coeff)
{
if(value >= -0.5 && value < 0.5)
bits = 0;
else
{
bits = ceil( log(value_intpart)/log(2) + 1 );
std::cout << "Value_intpart: " << value_intpart << " Log2: " << log(value_intpart)/log(2) << std::endl;
}
std::cout << "Bits: " << bits << std::endl;
max_coeff = value;
}
}

Это дает мне следующий вывод:

Value: 0.333333
Bits: 0
Value: 0.676768
Value_intpart: 1 Log2: 0
Bits: 1
Value: -0.676768
Value_intpart: 1 Log2: 0
Bits: 1
Value: 1.11111
Value_intpart: 2 Log2: 1
Bits: 2
Value: 2.36544
Value_intpart: 3 Log2: 1.58496
Bits: 3
Value: -2.36584
Value_intpart: 3 Log2: 1.58496
Bits: 3
Value: 10.3654
Value_intpart: 11 Log2: 3.45943
Bits: 5

Но я не совсем уверен в эффективности этого кода и в том, является ли он полностью правильным. Например, я не нашел другого способа проверить вручную область от -0,5 до 0,5 (без 0,5). Не могли бы вы дать мне обратную связь с этим кодом?

0

Решение

#include <algorithm>        // std::max
#include <iostream>
#include <iomanip>
#include <math.h>           // frexp
#include <utility>          // std::begin, std::end
using namespace std;

auto exponent_of( const double x )
-> int
{
int result;
frexp( x, &result );
return result;
}

auto main() -> int
{
const double values[] =
{
+0.33333333333333333,
+0.67676767676767676,
-0.67676767676767777,
+1.1111111111111111,
+2.3654375346357653,
-2.3658375346397653,
+10.365437534635765
};

int max_exponent = 0;
cout << fixed << setprecision( 8 );
for( const double x : values )
{
const int exponent = exponent_of( x );
cout << setw( 12 ) << x << setw( 4 ) << exponent << endl;
max_exponent = max( max_exponent, exponent );
}
cout << "Max binary exponent = " << max_exponent << endl;
}

Выход:

0,33333333 -1
0,67676768 0
-0,67676768 0
1.11111111 1
2.36543753 2
-2,36583753 2
10,36543753 4
Макс бинарный показатель = 4

Это означает, что вам нужно 4 двоичных числа для целой части числа с наибольшим абсолютным значением.

0

Другие решения

int_bits = 0;
val = 0;
for(i=0;i<array_length;++i){
val = ceil(log(abs(array[i]))/log(2)) + 1;
if(val > int_bits){
int_bits = val;
}
}

+1 должен учитывать бит знака, который теряется из-за функции abs

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector