Type de données décimal exact pour C ++?
PHP a un type décimal, qui n'a pas la "inexactitude" de chars et de doubles, de sorte que 2.5 + 2.5 = 5 et pas 4.999999999978325 ou quelque chose comme ça.
Donc je me demande si il ya un type de données de mise en œuvre pour le C ou le C++?
source d'informationauteur dtech
Vous devez vous connecter pour publier un commentaire.
Oui:
Il y a une précision arbitraire des bibliothèques en C++.
Un bon exemple est La GNU Multiple Precision arithmétique de la bibliothèque.
La Coup de pouce.Multiprecision la bibliothèque dispose d'un décimal en fonction de virgule flottante de classe de modèle appelé
cpp_dec_float
pour lequel vous pouvez spécifier toute précision que vous voulez.Il y aura toujours un certain degré de précision. Sur tout ordinateur représentation des nombres, il y aura toujours des nombres qui peuvent être représentés avec précision, et d'autres numéros qui ne le peuvent pas.
Les ordinateurs utilisent une base de 2 du système. Les nombres tels que 0.5 (2^-1), 0.125 (2^-3), 0.325 (2^-2 + 2^-3) seront représentés avec précision (de 0,1 à 0,001, 0.011 pour le cas ci-dessus).
Dans une base de 3 ces chiffres ne peuvent pas être représentées de façon précise (la moitié serait 0.111111...), mais d'autres numéros peut être précis (par exemple, 2/3 0,2)
Même dans l'homme de base de 10 système il y a des nombres qui ne peuvent pas être représentés avec précision, par exemple 1/3.
Vous pouvez utiliser nombre rationnel de la représentation et de tous les ci-dessus seront exacts (1/2, 1/3, 3/8, etc.) mais il y aura toujours des nombres irrationnels. Vous êtes également pratiquement limité par la taille des entiers de cette représentation.
Pour tous les non-représentable, le numéro, vous pouvez étendre la représentation de l'inclure de manière explicite. (par exemple, comparer des nombres rationnels et une représentation
a/b + c/d*sqrt(2)
), mais il y aura toujours plus de chiffres, ce qui ne peut pas toujours être correctement représentés. Il y a une preuve mathématique que le dit.Soi - permettez-moi de vous poser cette question: qu'est-ce exactement avez-vous besoin? Peut-être précises de calcul décimal à base de chiffres, par exemple dans certaines monétaire calcul?
Si vous êtes à la recherche pour le type de données de soutien de l'argent /monnaie ensuite, essayez ceci:
https://github.com/vpiotr/decimal_for_cpp
(en-tête de la seule solution)
Ce que vous me demandez, c'est anti-physique.
Ce phyton (et C++) faire est de couper l'inexactitude en arrondissant le résultat au moment de l'imprimer, en réduisant le nombre de chiffres significatifs:
tout à fait x pour être imprimé avec 6 chiffres de précision (alors que x lui-même a plus de 12 ans), et seront arrondis à 5, en découpant l'imprécision.
Les Alternatives ne sont pas à l'aide à virgule flottante à tous, et de mettre en œuvre des types de données qui n'juste integer "l'échelle" de l'arithmétique:
25/10 + 25/10 = 50/10;
Noter, cependant, que cela permettra de réduire la limite supérieure représentée par chaque type entier. Le gain de précision (et de la précision) se traduira par un plus rapide à atteindre le point de déborder.
Rationnelle de l'arithmétique est également possible (chaque nombre est représenté par un "numarator" et un "dénominateur"), sans perte de précision due à l'encontre de divisions, (qui, en réalité, ne sont pas moins exact) mais encore une fois, avec l'augmentation des valeurs comme le nombre d'opérations augmente (le moins "rationnelle" est le nombre, les plus importants sont le numérateur et le dénominateur) avec un plus grand risque de débordement.
En d'autres mots, le fait qu'un nombre fini de bits est utilisé à n'importe quel niveau d'organisation) se traduit toujours par une perte que vous avez à payer sur le côté de la petite sur le côté de grands nombres.
Je présume que vous parlez de la Calculatrice Binaire en PHP. Non, il n'existe pas dans le runtime C ou STL. Mais vous pouvez écrire votre propre si vous êtes si incliné.
Ici est une version C++ de BCMath compilé à l'aide de Facebook du HipHop for PHP:
http://fossies.org/dox/facebook-hiphop-php-cf9b612/dir_2abbe3fda61b755422f6c6bae0a5444a.html
Étant un langage de plus haut niveau
PHP
coupe juste à côté de ce que vous appelez "inexactitude" mais c'est certainement là. En C/C++, vous pouvez obtenir le même effet par le casting du résultat de type entier.