Я пытаюсь создать библиотеку с плавающей точкой произвольной точности на основе шаблонов в 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
,
Следовательно, это делает всю библиотеку бесполезной, поскольку она использует больше ресурсов, чем следует для указанной точности.
Я хотел бы знать, есть ли какой-либо другой тип данных произвольной точности, который служит моей цели.
Я сталкивался с несколькими библиотеками произвольной точности, но эти библиотеки имеют некоторую структуру кода, которая не может быть синтезирована в описания аппаратных средств с использованием синтеза высокого уровня (именно поэтому я и делаю эту библиотеку).
Это правильное решение для вас? 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;
Вы можете использовать ac_int из ac_datatypes от Mentor Graphics.
https://www.mentor.com/hls-lp/downloads/ac-datatypes
Это бесплатно и удобно в симуляции и в HLS.