[PYTHON] Police à virgule flottante 24h00

J'ai trouvé un article comme celui ci-dessous, alors j'ai crié "Ne bougez pas! Police à virgule flottante!" Et je suis monté à bord.

Cependant, je ne pense pas qu'il y ait un si gros problème.

Comme beaucoup le pensent, c'est un sujet général des nombres à virgule flottante, pas un sujet spécialisé en Python, ou on dit que c'est étrange parce qu'il est énorme ("Entiers énormes en virgule flottante sur 2 ^ 53" Si c'est étrange si vous calculez un nombre, vous pouvez comprendre le contenu d'un seul coup), et il y a des phrases étranges, mais je pense qu'il n'y a pas de gros malentendu.

Cependant, il n'y a qu'une seule description comme ci-dessous,

109999999999999995805696 0x1.74b1ca8ab05a8p + 76 ~ Tout pendant cette période 0x1.74b1ca8ab05a9p + 76 ~ 110000000000000012582912 0x1.74b1ca8ab05aap + 76 La largeur de la section est de 2 à la puissance 24, 16777216

J'étais un peu inquiet pour ce domaine. Est-il correct de dire que la largeur de cette section est de 2 ^ 24? Regardons de plus près.

.hex()Représentation en virgule flottante dans Le plus petit entier ayant la même représentation Entier maximum avec la même représentation Nombre d'entiers inclus dans cet intervalle
0x1.74b1ca8ab05a8p+76 109999999999999979028480 109999999999999995805696 16777217
0x1.74b1ca8ab05a9p+76 109999999999999995805697 110000000000000012582911 16777215
0x1.74b1ca8ab05aap+76 110000000000000012582912 110000000000000029360128 16777217

De cette manière, on peut voir qu'il n'est pas constant compte tenu de la largeur de l'intervalle qui devient la même représentation numérique à virgule flottante. C'est à peu près 2 ^ 24, donc c'est très bien! C'est normal de comprendre cela, mais depuis que j'ai fait des recherches jusqu'à présent, je pense qu'il est normal de creuser un peu plus profondément.

Même arrondi

Le coupable de ce phénomène apparemment mystérieux est "l'arrondi uniforme", qui est une méthode d'arrondi des nombres à virgule flottante. Cela s'appelle parfois l'arrondi banquier, mais en gros, cela signifie «arrondir à un nombre pair s'il se trouve au milieu du nombre qui peut être exprimé, et arrondir au côté le plus proche si ce n'est pas le cas».

En bref, si vous voulez arrondir 0,5 à un entier, vous devez l'arrondir à 0 au lieu de 1, et si vous voulez arrondir 1,5, vous devez l'arrondir à 2.

Vous ne comprenez peut-être pas la signification de "arrondir à un nombre pair" même si vous ne traitez que des entiers maintenant, mais en d'autres termes, en termes de nombres à virgule flottante, "si c'est au milieu du nombre qui peut être exprimé, le bit le plus bas de la partie incorrecte" Arrondissez sur le côté où est 0 ".

Si vous arrondissez 109999999999999995805696 à un nombre à virgule flottante, les nombres à virgule flottante les plus proches sont 109999999999999987417088.0 (= 0x1.74b1ca8ab05a8p + 76) et 110000000000000004194304.0 (= 0x1.74b1ca8ab05a9p + 76), les deux étant la même distance. Dans ce cas, le premier est pair, il est donc arrondi au premier.

En d'autres termes, en arrondi pair, l'entier arrondi à pair est un de plus que la largeur d'origine (?) De la section, et l'entier arrondi à impair est un de moins, de sorte que la largeur de la section augmente ou diminue alternativement comme indiqué ci-dessus. Voilà pourquoi.

Serpentin

~~ Multiplier les longs entiers la police laissera le soin aux autres ~~

La notation hexadécimale des nombres à virgule flottante est merveilleuse car vous pouvez dire en un coup d'œil si le bit le moins significatif de la partie formelle est 0 ou 1. Je veux qu'il soit adopté dans plus de langues.

Recommended Posts

Police à virgule flottante 24h00
Calcul de la fraction flottante de la commande awk
Afficher la sortie d'une liste de nombres à virgule flottante