2010-09-10 3 views
1

Quelle est la valeur entière la moins négative (négative) qui peut être exactement représentée par le type Double dans tous les principaux systèmes x86? Surtout dans (simultanément) JVM, MySQL, MS SQL Server, .Net, PHP, Python et JavaScript (quel que soit le type correspondant utilisé).Quelle est la valeur entière la moins négative (négative) qui peut être exactement représentée par le type Double dans tous les principaux systèmes x86?

La raison pour laquelle je pose cette question est parce que je voudrais choisir une valeur à utiliser pour représenter une erreur (pour retourner d'une fonction au cas où il ne pourrait pas être calculé avec succès) - c'est pourquoi j'ai besoin d'une valeur pour être 100% prévisible pour les vérifications d'égalité exactes. Les exceptions (try-catch) semblent fonctionner beaucoup plus lentement - c'est pourquoi j'ai besoin d'une telle chose.

Répondre

0

La plupart de vos langues et de vos produits de base de données utiliseront les formats IEEE Standard 754 simples et doubles. En C et C++, vous pouvez utiliser des formats étendus uniques et des formats étendus doubles, mais ces formats dépendent de l'architecture. Vos langages et bases de données de haut niveau et neutres pour la plate-forme évitent probablement de les exposer.

Selon la norme IEEE 754, vous ignorez qu'un double peut stocker Infinity et -Infinity et NaN alors:

  • nombre normal max: 1.7976931348623157e + 308
  • min positif nombre normal: 2.2250738585072014e- 308
  • nombre maximum subnormale: 2.2250738585072009e-308
  • min positif nombre subnormale: 4.9406564584124654e-324

Pour x86 à double format étendu:

  • 1.18973149535723176505e max normale + 4932
  • min positif normal: 3.36210314311209350626e-4932
  • max subnormale: 3.36210314311209350608e-4932
  • min positif subnormale: 3.64519953188247460253e -4951

Il fonctionne comme un double a:

  • Chiffres significatifs (binaires): 53
  • Le plus petit positif Nombre normal: 2,225 ... 10 -308
  • Le plus grand positif Nombre 1,797 ... 10
  • Chiffres significatifs (décimal): 15-17

Et une double extension (x86) a:

  • significatif Digits (binaire): 64
  • plus petit nombre normal positif: 3,362 ... 10 -4932
  • Le plus grand positif Nombre 1,189 ...10
  • significatif Digits (décimal): 18-21
+0

Je pense que les valeurs de telles grandeurs ne sont pas représentées exactement. La raison pour laquelle je pose cette question est parce que je voudrais choisir une valeur à utiliser pour représenter une erreur (pour retourner d'une fonction au cas où il ne pourrait pas être calculé avec succès) - c'est pourquoi j'ai besoin d'une valeur exacte % prévisible pour les vérifications d'égalité exactes. – Ivan

+0

Pourquoi pas «NaN»? –

+0

@ adam-goode, Cela a été le premier à venir dans mon esprit, j'ai essayé. Je ne me souviens pas exactement comment c'était, mais cela a été refusé par le compilateur Scala (le langage principal que j'utilise). – Ivan

0

double (selon IEEE 754) a 52 bits mantisse + 1 bit de mantisse le plus significatif ne sont pas représentés au format iself (comme ce bit toujours == 1 pour les nombres normalisés).
donc int max exactement reprsentable comme un double est (2^53-1) et une min est - (2^53-1), environ + - 8 quadrillions (ou billard en nombre longue échelle système de nommage)

0

En Smalltalk squeak, nous avons cette méthode

maxExactInteger 
    "Answer the biggest integer such that it is exactly represented in a float, and all smaller integers also are" 
    ^1 bitShift: self precision 

où la précision est de 53 pour un double (53 bits mantisse implicite d'un inclus). Oui, bien sûr, 2^53 est représenté exactement, et tous les plus petits entiers positifs aussi, mais 2^53 + 1 ne l'est pas, il faudrait 54 bits, et serait arrondi à 2^53 ...

C'est la même chose pour les négatifs, le moins est -2^53 (il n'y a pas de truc à 2-complément dans la représentation en virgule flottante IEEE 754, juste un bit de signe).

Questions connexes