In che modo Lua gestisce sia numeri interi che numeri a virgola mobile?

11

Per quanto mi ricordo della programmazione mi è stato insegnato a non confrontare i numeri in virgola mobile per l'uguaglianza. Ora, durante la lettura di Programmazione in Lua sul tipo Lua number , ho trovato seguente:

The number type represents real (double-precision floating-point) numbers. Lua has no integer type, as it does not need it. There is a widespread misconception about floating-point arithmetic errors and some people fear that even a simple increment can go weird with floating-point numbers. The fact is that, when you use a double to represent an integer, there is no rounding error at all (unless the number is greater than 100,000,000,000,000). Specifically, a Lua number can represent any long integer without rounding problems. Moreover, most modern CPUs do floating-point arithmetic as fast as (or even faster than) integer arithmetic.

È vero per tutte le lingue? Fondamentalmente se non andiamo oltre il punto di virgola mobile in doppio, siamo al sicuro con l'aritmetica dei numeri interi? Oppure, per essere più in linea con il titolo della domanda, c'è qualcosa di speciale che Lua fa con il suo tipo number , quindi funziona bene sia come integer che in virgola mobile?

    
posta Petr Abdulin 29.07.2013 - 05:56
fonte

2 risposte

10

Lua afferma che i numeri in virgola mobile possono rappresentare numeri interi esattamente come i tipi interi, e sono incline a concordare. Non esiste una rappresentazione imprecisa di una parte numerica frazionaria da gestire. Sia che si memorizzi un numero intero in un numero intero, sia che lo si memorizzi nella mantissa di un numero in virgola mobile, il risultato è lo stesso: il numero intero può essere rappresentato esattamente, purché non si superi il numero di bit nella mantissa , + 1 bit nell'esponente.

Naturalmente, se provate a memorizzare un numero a virgola mobile reale (es. 12.345) in una rappresentazione in virgola mobile, tutte le scommesse sono disattivate, quindi il vostro programma deve essere chiaro che il numero è in realtà un vero numero intero che non lo fa t tracimare la mantissa, per trattarla come un intero reale (cioè rispetto al confronto dell'eguaglianza).

Se hai bisogno di più precisione intera di quella, puoi sempre utilizzare un libreria arbitraria di precisione .

Ulteriori letture
Qual è il valore massimo di un numero in Lua?

    
risposta data 29.07.2013 - 07:19
fonte
5

I doppi sono memorizzati come mantissa e come esponente. Vedi il formato per ulteriori informazioni. Fondamentalmente, tutti i numeri sono nella forma: mantissa * 2 esponente . Per qualsiasi intero inferiore a 2 52 , l'esponente sarà zero, rendendo la mantissa bit per bit equivalente a un intero senza segno a 52 bit. Un bit di segno separato viene utilizzato per indicare numeri negativi.

In effetti, anche interi interi superiori a 2 52 possono essere rappresentati esattamente, purché tutte le cifre oltre i 52 nd siano zeri. Inoltre, alcune frazioni, come 0,5, possono essere rappresentate esattamente. È solo quando la frazione si ripete continuamente (come 1/3) in base 2, o altrimenti richiede troppi bit oltre il punto di radix che si perde precisione.

    
risposta data 29.07.2013 - 17:46
fonte

Leggi altre domande sui tag