Failure su grandi numeri #9

Open
opened 2025-06-04 10:09:29 +00:00 by roughconsensusandrunningcode · 0 comments

Bug

Per un problema di arrotondamento in encode() non codifica correttamente grandi numeri, ad esempio con

    codec = Codec()

    for i in range(64):
        n = 2**i
        s = codec.encode(n)
        m = codec.decode(s)
        if n != m:
            print(i, n, m, s)

ottengo

54 18014398509481984 18014398509481989 mefiluvafodinizezu
55 36028797018963968 36028797018963973 vimutusanelacavovo
56 72057594037927936 72057594037927941 besuzurumebisadetise
57 144115188075855872 144115188075855882 bonuzulovicamagorami
58 288230376151711744 288230376151711834 cicuzotisudavarigevu
59 576460752303423488 576460752303423593 dufuziranogesegupiso
60 1152921504606846976 1152921504606847461 lonuzagecepomirufume
61 2305843009213693952 2305843009213694572 ticuvapidofezalomovi
62 4611686018427387904 4611686018427388724 bepufusedulemovatevesu
63 9223372036854775808 9223372036854777373 bofonumilosiziseposimo

Soluzione

Basta usare la divisione intera anziché int() - in libbanana.py linea 31 usare

v //= len(alphabets[idx])
invece di

v = int(v / len(alphabets[idx]))

### Bug Per un problema di arrotondamento in encode() non codifica correttamente grandi numeri, ad esempio con ``` codec = Codec() for i in range(64): n = 2**i s = codec.encode(n) m = codec.decode(s) if n != m: print(i, n, m, s) ``` ottengo ``` 54 18014398509481984 18014398509481989 mefiluvafodinizezu 55 36028797018963968 36028797018963973 vimutusanelacavovo 56 72057594037927936 72057594037927941 besuzurumebisadetise 57 144115188075855872 144115188075855882 bonuzulovicamagorami 58 288230376151711744 288230376151711834 cicuzotisudavarigevu 59 576460752303423488 576460752303423593 dufuziranogesegupiso 60 1152921504606846976 1152921504606847461 lonuzagecepomirufume 61 2305843009213693952 2305843009213694572 ticuvapidofezalomovi 62 4611686018427387904 4611686018427388724 bepufusedulemovatevesu 63 9223372036854775808 9223372036854777373 bofonumilosiziseposimo ``` ### Soluzione Basta usare la divisione intera anziché `int()` - in libbanana.py linea 31 usare `v //= len(alphabets[idx])` invece di `v = int(v / len(alphabets[idx]))`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
itec/banana#9
No description provided.