254 votes

Moyen le plus sûr pour convertir char en entier en python ?

Mathématiques Python module contient des fonctions pratiques comme floor & ceil. Ces fonctions prennent un nombre à virgule flottante et retourner l'entier le plus proche au-dessous ou au-dessus d'elle. Cependant, ces fonctions renvoient la réponse comme un nombre à virgule flottante. Par exemple:

import math
f=math.floor(2.3)

Maintenant, f retourne:

2.0

Quel est le moyen le plus sûr pour obtenir un nombre entier de ce flotteur, sans courir le risque d'erreurs d'arrondi (par exemple si le flotteur est l'équivalent de 1.99999) ou peut-être que je devrais utiliser une autre fonction tout à fait?

200voto

Philipp Points 21479

Tous les nombres entiers qui peuvent être représentées par des nombres à virgule flottante avoir une représentation exacte. De sorte que vous pouvez utiliser en toute sécurité int sur le résultat. Inexact représentations se produire uniquement si vous êtes en essayant de représenter un nombre rationnel avec un dénominateur qui est pas une puissance de deux.

Que cette marche n'est pas trivial du tout! C'est une propriété de la virgule flottante IEEE de la représentation que l'int∘étage = ⌊⋅⌋ si l'ampleur des chiffres en question est assez petit, mais les différentes représentations sont possibles, où int(étage(2.3)), pourrait être de 1.

Pour citer Wikipedia,

Tout entier avec une valeur absolue inférieure ou égale à 224 peut être représentée exactement dans le format simple précision, et tout entier avec une valeur absolue inférieure ou égale à 253 peut être représentée exactement dans le format double précision.

135voto

srodriguex Points 102

Utilisation `` va clouer.

56voto

Wade73 Points 2102

Vous pouvez utiliser la fonction arrondi. Si vous n’utilisez pas de second paramètre (nombre de chiffres significatifs) alors je pense que vous obtiendrez le comportement souhaité.

Sortie de veille.

47voto

user3763109 Points 21

La combinaison de deux des résultats précédents, on obtient :

Ceci convertit un flotteur en entier assez fiable.

19voto

phant0m Points 8545

Que cette marche n'est pas trivial du tout! C'est une propriété de la virgule flottante IEEE de la représentation que l'int∘étage = ⌊⋅⌋ si l'ampleur des chiffres en question est assez petit, mais les différentes représentations sont possibles, où int(étage(2.3)), pourrait être de 1.

Ce post explique pourquoi cela fonctionne dans la gamme.

Dans un double, vous pouvez représenter des entiers 32 bits sans aucun problème. Il ne peut pas être tout arrondi. Plus précisément, doubles peuvent représenter tous les entiers entre 253 et -253.

Petite explication: Un double peut stocker jusqu'à 53 chiffres binaires. Lorsque vous avez besoin de plus, le nombre est complétée par des zéros sur la droite.

Il s'ensuit que 53 est le plus grand nombre qui peut être stocké sans rembourrage. Naturellement, tous les (entier) le nombre, nécessitant moins de chiffres peuvent être stockées de façon précise.

Ajouter un à 111(omis)111 (53) les rendements de 100 000..., (53 zéros). Comme nous le savons, nous pouvons stocker 53 chiffres, qui rend le plus à droite zéro de remplissage.

C'est là que 253 .


Plus de détail: Nous avons besoin d'examiner la façon dont la norme IEEE-754 virgule flottante œuvres.

  1 bit    11 / 8     52 / 23      # bits double/single precision
[ sign |  exponent | mantissa ]

Le numéro est alors calculé comme suit (à l'exclusion des cas spéciaux qui ne sont pas pertinentes ici):

-1signe × 1.mantisse ×2exposant de polarisation

biais = 2exposant - 1 - 1, c'est à dire 1023 et 127 pour double/simple précision, respectivement.

Sachant que le fait de multiplier par 2X simplement décale tous les bits de X à gauche, il est facile de voir que tout entier doit avoir tous les bits de la mantisse que l'extrémité droite de la virgule décimale à zéro.

Tout entier à l'exception du zéro a la forme suivante en binaire:

1x...x où les x-es représentent les bits vers la droite de la MSB (most significant bit).

Parce que nous avons exclu de zéro, il y aura toujours un MSB qu'est—ce qui est pourquoi il n'est pas stocké. Pour stocker un entier, nous devons le ramener dans le formulaire précité: -1signe × 1.mantisse ×2exposant de polarisation.

C'est en disant la même chose que de décaler les bits dans le point décimal jusqu'à ce qu'il n'est que le MSB vers la gauche de l'ESM. Tous les bits à droite de la virgule sont ensuite stockées dans la mantisse.

À partir de cela, nous pouvons voir que l'on peut stocker à plus de 52 chiffres binaires en dehors de l'ESM.

Il en résulte que le nombre le plus élevé où tous les bits sont explicitement stockée est

111(omitted)111.   that's 53 ones (52 + implicit 1) in the case of doubles.

Pour cela, nous devons mettre de l'exposant, de telle sorte que le point décimal sera décalé de 52 places. Si nous étions à l'augmentation de l'exposant par l'un, nous ne pouvons pas connaître les chiffres de droite à gauche après le point décimal.

111(omitted)111x.

Par convention, c'est 0. Réglage de l'ensemble de la mantisse à zéro, nous avons reçu le numéro suivant:

100(omitted)00x. = 100(omitted)000.

C'est un 1 suivi de 53 zéros, 52 stockées et 1 ajoutées en raison de l'exposant.

Il représente 253, qui marque la frontière (à la fois positifs et négatifs) entre lesquelles on peut représenter tous les nombres entiers. Si nous voulions ajouter un à 253, on aurait à définir l'implicite zéro (dénoté par l' x), mais c'est impossible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X