Библиотека произвольной точности с плавающей точкой для синтеза высокого уровня

Я пытаюсь создать библиотеку с плавающей точкой произвольной точности на основе шаблонов в C ++, которая поддерживает переменные Exponents и переменную Mantissa, которые можно указывать в качестве аргументов шаблона. Я уже разработал основанную на шаблонах библиотеку Fixed Point. Тип реализации, которую я хочу:

 template<int EXPONENT_BITS, int MANTISSA_BITS>
struct fp_float
{
<some_data_type_to_store_exponent_and_mantissa_values>;
};

Я не могу найти подходящий тип данных для хранения показателей, чтобы я не использовал больше битов, чем необходимо для кода. Я думал об использовании intn_t где n = {8, 16, 32, 64} но тогда, если я объявлю fp_float<3,11> это будет использовать 8 биты для EXPONENT а также 16 биты для MANTISSA,

Следовательно, это делает всю библиотеку бесполезной, поскольку она использует больше ресурсов, чем следует для указанной точности.

Я хотел бы знать, есть ли какой-либо другой тип данных произвольной точности, который служит моей цели.

Я сталкивался с несколькими библиотеками произвольной точности, но эти библиотеки имеют некоторую структуру кода, которая не может быть синтезирована в описания аппаратных средств с использованием синтеза высокого уровня (именно поэтому я и делаю эту библиотеку).

1

Решение

Это правильное решение для вас? base_int_t — это тип черты, который дает вам базовый тип, который будет использоваться в последующем определении битового поля. В приведенном ниже коде отсутствует специализация для N> 2

// gives an integer type fitting in N bytes
template <int N>
struct base_int_t
{
typedef int type;
};
// specializations
template <>
struct base_int_t<1>
{
typedef unsigned char type;
};

template <>
struct base_int_t<2>
{
typedef unsigned short type;
};
// add suitable definitions for N = 3,4...8. For N = 3 and 4 type is unsigned int

template <int EXP_BITS, int MANTISSA_BITS>
struct fp_float
{
// template argument is the number of bytes required
typedef typename base_int_t<(EXP_BITS + MANTISSA_BITS + 7) / 8>::type type;
type mantissa : MANTISSA_BITS;
type exponent : EXP_BITS;
};

typedef fp_float<3, 11> fp_3_11_t;
fp_3_11_t fp;
1

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

Вы можете использовать ac_int из ac_datatypes от Mentor Graphics.

https://www.mentor.com/hls-lp/downloads/ac-datatypes

Это бесплатно и удобно в симуляции и в HLS.

1

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