Stocker des nombres avec une plus grande précision en C

J’écris un programme dans lequel j’ai besoin de stocker des nombres avec une très grande précision (environ 10^-10 ), puis de les utiliser avec un paramètre ( create_bloomfilter ([yet to decide the type] falsePositivity, long expected_num_of_elem) ).
La précision la plus élevée que je peux obtenir est celle de double (environ 10^-6 ), ce qui n’est pas suffisant.

Comment pouvons-nous stocker des nombres avec une plus grande précision en c?

Vous avez été mal informé à propos de double .

Le plus petit nombre positif que vous pouvez stocker dans un double est d’environ 210 -308 , sans compter les nombres dénormalisés, qui peuvent être plus petits. Les denormaux descendent à 5⨯10 -324 . Ils ont l’équivalent d’environ 15-17 chiffres de précision, ce qui est suffisant pour mesurer le diamètre de la Terre à la taille d’un globule rouge, la plus petite cellule du corps humain.

Si vous avez vraiment besoin de plus de précision, vous avez besoin de MPFR. (Si vos algorithmes sont numériquement instables, MPFR pourrait ne pas aider.)

Edit: J’ai compris ce que vous faites mal.

En C, 10^-7 est une expression entière. Il devrait être égal à -13 sur la plupart des systèmes. L’opérateur ^ est l’opérateur XOR au niveau du bit, pas l’opérateur d’exponentiation. Il n’y a pas d’opérateur d’exponentiation en C, car les opérateurs C correspondent généralement à des opérations plus primitives, du moins en termes de mise en œuvre matérielle.

Vous voulez 1e-7 , ou pow(10, -7) .

 #include  #include  int main(int argc, char *argv[]) { printf("2e-308 = %g\n", 2e-308); printf("2 * pow(10, -308) = %g\n", 2 * pow(10, -308)); printf("10^-7 = %d\n", 10^-7); return 0; } 

Sortie:

 2e-308 = 2e-308
 2 * pow (10, -308) = 2e-308
 10 ^ -7 = -13

Notez qu’il y a beaucoup de pièges à nombres flottants.

Essayez les bibliothèques GNU MPFR et GNU GMP

La bibliothèque MPFR est une bibliothèque C pour les calculs à virgule flottante à précisions multiples avec un arrondi correct.

GMP est une bibliothèque libre pour l’arithmétique en précision arbitraire, fonctionnant sur des entiers signés, des nombres rationnels et des nombres à virgule flottante. Il n’y a pas de limite pratique à la précision, à l’exception de celles impliquées par la mémoire disponible dans la machine sur laquelle GMP s’exécute. GMP a un riche ensemble de fonctions, et les fonctions ont une interface régulière.

Est-ce long double suffisant? Certaines implémentations utilisent 128bit long double, ce qui devrait facilement répondre à vos besoins.

http://en.wikipedia.org/wiki/Quadruple_precision

Si vous recherchez quelque chose d’extrêmement fort, consultez MPFR