用于高级综合的任意精度浮点库

Posted

技术标签:

【中文标题】用于高级综合的任意精度浮点库【英文标题】:Arbitrary Precision Floating Point library for High Level Synthesis 【发布时间】:2015-07-14 07:56:58 【问题描述】:

我正在尝试在 C++ 中创建一个基于模板的任意精度浮点库,它支持可以指定为模板参数的变量指数和变量尾数。我已经开发了一个基于模板的定点库。我想要的实现类型是:

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

我无法找到合适的数据类型来存储指数,因此我使用的位数不会超过代码所需的位数。我曾想过在n = 8, 16, 32, 64 处使用intn_t,但如果我声明fp_float&lt;3,11&gt;,它将为EXPONENT 使用8 位,为MANTISSA 使用16 位。

因此,它使整个库变得毫无用处,因为它使用的资源超出了指定精度应有的资源。

我想知道是否有任何其他任意精度的数据类型可以满足我的目的。

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

【问题讨论】:

@Bathsheba :我确实经历过BoostMPFRttmathGMP 并尝试将它们合成到硬件描述中,但它们都使用了几种代码实现Vivado 等高级综合工具支持。我必须使库合成兼​​容的事实是我构建它的原因。 【参考方案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;

【讨论】:

是的,这很有帮助。 ,但是一旦我过了 16 ,它又又有了自己的缺点。但它绝对是低位宽的好方法。【参考方案2】:

您可以使用 Mentor Graphics 的 ac_datatypes 中的 ac_int。

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

它在模拟和 HLS 中是免费且可用的。

【讨论】:

以上是关于用于高级综合的任意精度浮点库的主要内容,如果未能解决你的问题,请参考以下文章

linux的bc命令介绍

JavaScript高级程序设计(第三版) 5/25

Linux--表的高级操作/外键约束 MySQL数据库管理

用于任意数字精度的 .NET Framework 库

Vuejs高级之:路由综合实例

数学运算高级工具bc:小数精度;进制转换;计算平方及平方根