1

J'essaie de créer une bibliothèque à virgule flottante de précision arbitraire basée sur un modèle en C++ qui supporte les variables Exponents et la variable Mantissa qui peut être spécifiée en tant qu'arguments de modèle. J'ai déjà développé une bibliothèque de points fixes basée sur un modèle. Le type de mise en œuvre que je veux est:Bibliothèque de virgules flottantes de précision arbitraire pour la synthèse de haut niveau

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

Je suis incapable de trouver un type de données approprié pour stocker les exposants pour que je ne pas utiliser plus de bits que nécessaire pour le code. Je pensais utiliser intn_tn = {8, 16, 32, 64} mais si je déclare fp_float<3,11> il utilisera 8 bits pour EXPONENT et 16 bits pour MANTISSA. Par conséquent, cela rend toute la bibliothèque inutile car elle utilise plus de ressources qu'elle ne le devrait pour une précision spécifiée.

Je voudrais savoir s'il existe d'autres types de données de précision arbitraires qui répondent à mes besoins.

J'ai rencontré quelques bibliothèques de précision arbitraires, mais ces bibliothèques ont une structure de code qui ne peut pas être synthétisée dans Descriptions matérielles en utilisant la synthèse de haut niveau (raison pour laquelle je crée cette bibliothèque).

+0

Boost en avoir un. – Bathsheba

+0

@Bathsheba: J'ai passé par 'Boost',' MPFR', 'ttmath' et' GMP' et essayé de les synthétiser en descriptions matérielles, mais ils utilisent tous plusieurs implémentations de code qui ne sont pas supportées par les outils de synthèse de haut niveau comme Vivado. Le fait que je doive rendre la bibliothèque compatible avec la synthèse est la raison pour laquelle je la construis. –

Répondre

1

Est-ce une solution valable pour vous? base_int_t est un type de trait qui vous donne le type de base à utiliser dans la définition de champ de bits suivante. Le code ci-dessous manque les spécialisations 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; 
+0

Oui, cela aide beaucoup. , mais une fois que j'ai passé 16 ans, il a encore ses propres défauts. Mais c'est certainement un bon hack pour les largeurs de bits faibles. –