Question

Toutes les méthodes System.Math Takes double comme paramètres des paramètres et des retours. Les constantes sont également de type double. J'ai vérifié MathNet.Numerics , et même semble être le cas là.

Pourquoi est-ce? Surtout pour les constantes. N'est pas decimal censé être plus précis? Ne serait-ce souvent genre d'utile pour faire des calculs?

Était-ce utile?

La solution

Ceci est un commerce de vitesse par rapport à précision classique au large.

Cependant, gardez à l'esprit que pour PI, par exemple, les chiffres les plus que vous aurez jamais besoin est de 41.

  

Le plus grand nombre de chiffres de pi   que vous avez besoin est 41. Pour   calculer la circonférence de la   univers avec une erreur inférieure à la   diamètre d'un proton, vous avez besoin 41   chiffres de pi †. Il semble raisonnable de   conclure que les 41 chiffres suffit   précision pi pour tout cercle   problème de mesure que vous êtes susceptible de   rencontre. Ainsi, dans le plus d'un   billion chiffres de pi calculées en   2002, tous les chiffres au-delà de la 41e ont   aucune valeur pratique.

En outre, décimal et double ont une structure de stockage interne légèrement différente. Décimales sont conçus pour stocker la base de données 10, où en tant que doubles (et flotteurs), sont faites pour contenir des données binaires. Sur une machine binaire (comme chaque ordinateur existe) un double aura moins de bits gaspillées lors de l'enregistrement un nombre quelconque dans sa gamme.

Voir également:

System.Double      8 bytes    Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures
System.Decimal    12 bytes    Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

Comme vous pouvez le voir, décimal a une plage plus petite, mais une plus grande précision.

Autres conseils

Non, - décimales ne sont pas plus « exact » que doubler, ou pour cette matière, tout type. Le concept de « précision », (en parlant de représentations numériques dans un compuiter), est ce qui est faux. Tout type est absolument 100% exacte à représenter certains chiffres. octets non signés sont 100% exacte à représenter les nombres entiers de 0 à 255. mais ils ne sont pas bons pour les fractions ou négatifs ou entiers en dehors de la plage.

Décimales sont 100% Exact à représenter un certain ensemble de base 10 valeurs . doubles (car ils stockent leur valeur en utilisant binaire Représentation exponentielle IEEE) sont exactes à représenter un ensemble de binaires Numéros . Ni est plus précis que de l'autre en général, ils sont tout simplement à des fins différentes.

Pour élaborer un peu furthur, puisque je semble ne pas être assez clair pour certains lecteurs ...

Si vous prenez chaque numéro qui est représentable comme une décimale, et marquez chacun d'eux sur une ligne numérique, entre tous paire adjacente d'entre eux il y a une somme supplémentaire l'infini des nombres réels qui sont un nombre décimal pas représentable. La même déclaration exacte peut être faite sur les chiffres qui peuvent être représentés comme un double. Si vous avez marqué toutes les décimales sur la ligne numéro en bleu, et tous les deux en rouge, sauf pour les entiers, il y aurait très peu d'endroits où la même valeur a été marquée dans les deux couleurs. En général, pour 99,99999% des marques, (s'il vous plaît ne pas pinailler mon pourcentage) l'ensemble bleu (décimaux) est un ensemble complètement différent de chiffres de l'ensemble rouge (les doubles).

En effet, notre définition même pour l'ensemble bleu est qu'il est une base 10 mantisse / représentation de l'exposant, et un double est une base 2 représentation mantisse / exposant. Toute valeur représentée comme base 2 mantisse et l'exposant, (1.00110101001 x 2 ^ (-11101001101001) signifie prendre la valeur de la mantisse (de 1.00110101001) et le multiplier par 2 élevé à la puissance de l'exposant (lorsque l'exposant est ce négatif equivilent à diviser par 2 à la puissance de la valeur absolue de l'exposant). Cela signifie que lorsque l'exposant est négatif, (ou si une partie quelconque de la mantisse est un binaire fractionnée) le nombre ne peut pas être représenté sous la forme d'une mantisse et un exposant décimal, et vice versa.

Pour tout nombre réel arbitraire, qui tombe au hasard sur la vraie ligne de numéro, il sera soit plus proche de l'un des décimaux bleu, ou à l'un des doubles rouges.

décimal est plus précise, mais a moins d'une gamme. Vous utiliserez généralement double pour la physique et les calculs mathématiques, mais vous devez utiliser décimal pour les calculs financiers et monétaires.

Voir les articles suivants sur msdn pour plus de détails.

Double http://msdn.microsoft.com/en-us/library/678hzkk9. aspx

décimal http://msdn.microsoft.com/en-us/library/364x0z75. aspx

On dirait que la plupart des arguments ici pour « Il ne fait pas ce que je veux » sont «mais il est plus rapide », si bien que la bibliothèque est ANSI C + Gmp, mais personne ne préconise-ce pas?

Si vous voulez en particulier pour contrôler la précision, alors il y a d'autres langues qui ont pris le temps de mettre en œuvre une précision exacte, d'une manière contrôlable utilisateur:

http://www.doughellmann.com/PyMOTW/decimal/

Si la précision est vraiment important pour vous, alors vous êtes probablement mieux utiliser les langues que les mathématiciens utiliseraient. Si vous ne l'aimez pas Fortran alors Python est une alternative moderne.

Quelle que soit la langue que vous travaillez, rappelez-vous la règle d'or:  Éviter de mélanger les types ...  Donc, ne convertissez a et b être le même avant de tenter un opérateur b

Si je devais une supposition, je dirais que les leviers de fonctions fonctionnalité de mathématiques à faible niveau (peut-être en C) qui n'utilise pas décimaux en interne, et donc le retour d'un nombre décimal, il faudrait une distribution de la double décimale de toute façon. D'ailleurs, le but du type de valeur décimale est d'assurer l'exactitude; ces fonctions ne sont pas et ne peuvent pas retour à 100% des résultats précis sans précision infinie (par exemple, des nombres irrationnels).

Ni décimal ni flotter ou double sont assez bons si vous avez besoin quelque chose pour être précis. En outre, décimal est si cher et galvaudé là il devient une blague régulière.

Si vous travaillez dans des fractions et nécessitent une précision optimale, utiliser des fractions. Il est même vieille règle, convertir une fois et seulement si nécessaire. Vos règles d'arrondi trop varient par application, domaine et ainsi de suite, mais que vous pouvez trouver un exemple bizarre ou deux où il convient. Mais encore une fois, si vous voulez des fractions et la précision ultime, la réponse est de ne pas utiliser autre chose que des fractions. Pensez vous voudrez peut-être une caractéristique de précision arbitraire aussi bien.

Le problème réel avec CLR en général est qu'il est si étrange et simple à mettre en œuvre brisée une bibliothèque qui traite de la mode générique numerics en grande partie en raison de la mauvaise conception primitive et lacune du compilateur le plus populaire pour la plate-forme. Il est presque le même que celui avec Java fiasco.

à deux se juste être le meilleur compromis couvrant la plupart des domaines, et il fonctionne bien, malgré le fait MS JIT est encore incapable d'utiliser une technologie de processeur qui est d'environ 15 ans maintenant.

[pièce aux utilisateurs des compilateurs de ralentissement MSDN]

Double est un type intégré. Est-ce est pris en charge par FPU / noyau SSE (anciennement connu sous le nom « Math coprocesseur »), voilà pourquoi il est extrêmement rapide. Surtout à la multiplication et les fonctions scientifiques.

décimal est en fait une structure complexe, constituée de plusieurs nombres entiers.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top