int () truncates its result to 32 bits
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 88/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- javascript, python
- Ambito
- compilers
Direzione di ricerca
Inizia dalla riga 291 di builtin.js, dove int() usa attualmente la conversione bit a bit di JavaScript, e controlla development/automated_tests/transcrypt/div_issues/init.py per il testlet dell’Issue 911. Fai in modo che i controlli sui numeri interi grandi passino, preservando il troncamento verso zero per i float negativi, quindi esegui il testlet con Node usando le opzioni del compilatore indicate.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
int (x) compiles to float (x) | 0. JavaScript's | converts its left operand with ToInt32, so the result is always a signed 32 bit integer. Arguments outside -2**31 ... 2**31 - 1 come back wrong, multiples of 2**32 come back as 0.
Reproducer
values = [8589934588, 9007199254740988, 2147483648, 4294967296]
for v in values:
print (v, '->', int (v))
CPython:
8589934588 -> 8589934588
9007199254740988 -> 9007199254740988
2147483648 -> 2147483648
4294967296 -> 4294967296
Transcrypt:
8589934588 -> -4
9007199254740988 -> -4
2147483648 -> -2147483648
4294967296 -> 0
Run with 3.7.16 on Python 3.7, compiled with -b -n -e 6 and executed under
node. Line 291 of __builtin__.js is identical on current master.
The failure is quiet. A memory size in kB, a file offset or a timestamp in microseconds passes 2**31 during normal operation and then yields a small or negative number instead of an error.
Testlet
For development/automated_tests/transcrypt/div_issues/__init__.py:
autoTester.check ('Issue 911') # int () truncated to 32 bits
autoTester.check (int (2147483648))
autoTester.check (int (4294967296))
autoTester.check (int (8589934588))
autoTester.check (int (9007199254740988))
autoTester.check (int (-5.7), int (5.7))
Possible fix
export function int (any) {
var f = float (any);
return f === Infinity || f === -Infinity || isNaN (f) ? 0 : Math.trunc (f);
};
This makes int () exact over the whole range where a JavaScript number is exact, up to 2**53 - 1, and leaves truncation toward zero for negative floats unchanged. With the patch applied the reproducer above matches CPython.
Math.trunc is ES6. The default target is esv 6 and javascriptVersion gates nothing in the code generator, so no version switch is needed. int has no callers inside the runtime.
Note on NaN and Infinity
NaN | 0 and Infinity | 0 currently yield 0, where CPython raises ValueError and OverflowError. The version above keeps the 0 to stay minimal. Raising instead would match CPython but changes behaviour beyond the range fix, so it seems worth deciding separately.
- Lingua principale
- Python
- Stelle
- 2.9k
- Fork
- 218
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Nessuna guida per i contributori indicizzata per questo repository
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di TranscryptOrg/Transcrypt
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
TranscryptOrg/Transcrypt#913 ·
-
IS: bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
TranscryptOrg/Transcrypt#908 ·
-
SUB: documentation
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 62/100
TranscryptOrg/Transcrypt#656 · 7 commenti ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 76/100
TranscryptOrg/Transcrypt#914 ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
TranscryptOrg/Transcrypt#910 ·
Tutte le issue di TranscryptOrg/Transcrypt
Issue simili
-
essnmx good first issue
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 95/100
-
[Feature] 奇物选择添加优先级 Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
syfoud/Simulated_Scepter#174 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
Giskard-AI/giskard-oss#2840 · 1 commento ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success Apertaarea: repo bug perceived difficulty: 2
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
yeti-platform/yeti#1380 ·