用于高级综合的任意精度浮点库 我试图在C++中制作一个基于模板的任意精度浮点库,它支持可变的指数和可变尾数,这些变量可以被指定为模板参数。我已经开发了一个基于模板的定点库。我想要的实现类型是: template<int EXPONENT_BITS, int MANTISSA_BITS> struct fp_float { <some_data_type_to_store_exponent_and_mantissa_values>; }; 模板 结构fp_浮点 { ; };

用于高级综合的任意精度浮点库 我试图在C++中制作一个基于模板的任意精度浮点库,它支持可变的指数和可变尾数,这些变量可以被指定为模板参数。我已经开发了一个基于模板的定点库。我想要的实现类型是: template<int EXPONENT_BITS, int MANTISSA_BITS> struct fp_float { <some_data_type_to_store_exponent_and_mantissa_values>; }; 模板 结构fp_浮点 { ; };,c++,templates,floating-point,floating-point-precision,arbitrary-precision,C++,Templates,Floating Point,Floating Point Precision,Arbitrary Precision,我无法找到一个合适的数据类型来存储指数,这样我就不会使用比代码所需更多的位。我想用intn\u twheren={8,16,32,64}但是如果我声明fp\u float它将使用8位表示指数和16位表示尾数 因此,它使整个库毫无用处,因为它使用的资源超过了它在指定精度下应该使用的资源 我想知道是否还有其他任意精度的数据类型符合我的目的 我确实遇到过一些任意精度的库,但这些库有一些代码结构,无法使用高级合成将其合成为硬件描述(这就是我制作此库的原因) 这对您来说是有效的解决方案吗?base_int

我无法找到一个合适的数据类型来存储指数,这样我就不会使用比代码所需更多的位。我想用
intn\u t
where
n={8,16,32,64}
但是如果我声明
fp\u float
它将使用
8
位表示
指数
16
位表示
尾数

因此,它使整个库毫无用处,因为它使用的资源超过了它在指定精度下应该使用的资源

我想知道是否还有其他任意精度的数据类型符合我的目的


我确实遇到过一些任意精度的库,但这些库有一些代码结构,无法使用高级合成将其合成为硬件描述(这就是我制作此库的原因)

这对您来说是有效的解决方案吗?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;
//给出一个整数类型,单位为N字节
模板
结构基础\u内部\u t
{
typedef int类型;
};
//专业
模板
结构基础\u内部\u t
{
typedef无符号字符类型;
};
模板
结构基础\u内部\u t
{
typedef无符号短类型;
};
//为N=3,4…8添加合适的定义。对于N=3和4,类型为无符号int
模板
结构fp_浮点
{
//template参数是所需的字节数
typedef typename base_int_t::type type;
输入尾数:尾数位;
类型指数:EXP_位;
};
typedef fp_float fp_3_11_t;
fp_3_11_t fp;

您可以通过Mentor Graphics从ac_数据类型使用ac_int


它在仿真和HLS中都是免费和可用的。

@Bathsheba:我确实经历了
Boost
MPFR
ttmath
GMP
,并试图将它们合成为硬件描述,但它们都使用了一些像Vivado这样的高级合成工具不支持的代码实现。事实上,我必须使图书馆综合兼容是我建造它的原因。是的,这很有帮助,但一旦我过了16岁,它又有自己的缺点。但它绝对是一个很好的低位宽度的黑客。