J'essaie de voir la chaîne de bits du plus grand entier positif qui peut être exactement représenté en utilisant Julia. Wikipedia dit que 2 ^ 1024 * (1-2 ^ (- 53) ) est l'entier. Cependant, lorsque j'essaie d'utiliser Julia, la chaîne de bits est entièrement composée de zéros.

julia> bitstring(Float64( 2^1024  - 2^971  ))
"0000000000000000000000000000000000000000000000000000000000000000"

Le bitstring que j'attends est

0 11111111110 1111111111111111111111111111111111111111111111111111

Pouvez-vous s'il vous plaît m'aider à clarifier pourquoi cet écart se produit?

2
honeybadger 28 août 2020 à 12:17

2 réponses

Meilleure réponse

Ces puissances d'entiers débordent à zéro entier avant de devenir des flottants. Vous pouvez cependant travailler en BigInt:

julia> 2^1024  - 2^971
0

julia> big"2"^1024  - big"2"^971
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

julia> Float64(big"2"^1024  - big"2"^971)
1.7976931348623157e308

julia> bitstring(ans)
"0111111111101111111111111111111111111111111111111111111111111111"

Ou bien convertissez déjà les entiers d'entrée en flottants.

5
phipsgabler 28 août 2020 à 12:13

2^1024 - 2^971 déborde avant la conversion en Float64. Au lieu de cela, vous pouvez faire

julia> bitstring(prevfloat(typemax(Float64)))
 "0111111111101111111111111111111111111111111111111111111111111111"

Il y a quelques avantages par rapport à l'approche big: Vous n'avez pas besoin de savoir quelle est la valeur maximale représentable - 2 ^ 1024 - 2 ^ 971; cela fonctionne pour de nombreux types différents (vous pouvez faire de même avec Float32, etc.); et c'est plus rapide.

Pour le type entier T, vous feriez

bitstring(typemax(T))

La raison d'utiliser prevfloat avec des flottants, est que typemax(Float64) est Inf;

7
DNF 29 août 2020 à 09:40