2016-03-31 1 views
0

J'essaie d'améliorer un programme C++ en utilisant le GMP (GNU Multiple Precision Arithmetic Library).comment calculer epsilon de mpf_class

Il existe une variable compteur qui sera périodiquement augmentée d'un résultat de calcul de type double. L'addition se passe à l'intérieur d'un ISR (routine de service d'interruption) à cause de cela, il devrait être rapide.

Jusqu'à présent, la variable compteur est de type double ce qui provoque un problème. Certains appareils (fonctionnant depuis des années) atteignent un point où chaque addition tombe sous l'effet de l'absorption, donc plus rien ne se passe. D'autres appareils commencent déjà à ignorer les petites additions.

Parce qu'il est temps de l'améliorer en utilisant mpf_class à la place double. Mais pour définir correctement la taille de mpf_class j'ai besoin de connaître le & epsilon; (epsilon).

Ma question est: Comment puis-je calculer l'epsilon d'un objet mpf_class?

Un exemple (C++) de ce calcul serait génial.

Répondre

0

Le type mpf dans GMP n'offre pas une représentation radix-2 exacte. La précision demandée est arrondie au nombre de bits dans l'élément de tableau sous-jacent, puis au moins un élément supplémentaire est ajouté. Si vous demandez une précision de 53 sur un système 32 bits typique, les valeurs réelles sont calculées avec entre 65 et 96 bits. (Techniquement, le type mpf utilise l'arithmétique radix 2^32 dans ce cas).

Je vous recommande de consulter la bibliothèque MPFR (point flottant de précision multiple avec arrondissement) à la place. Il utilise la bibliothèque GMP pour les calculs sous-jacents mais fournit un comportement plus prévisible. L'utilisation de MPFR est recommandée par une note dans la documentation GMP.

+0

ok ce n'est pas important pour moi de savoir si mon système utilise plus de mémoire. Je suis intéressé par le plus grand epsilon possible. J'ai juste besoin de vérifier si elle répond aux exigences. A côté de mpfr est installé, je peux l'utiliser si je dois le faire. Fournir une solution pour MPEG serait bien. – Sorko