2013-06-30 6 views
9
EDU>> intmin 
    ans = 

    -2147483648 

EDU>> abs(intmin) 

    ans = 

    2147483647 

Com'è possibile? Ci deve essere una sorta di overflow o le definizioni di queste funzioni si mescolano in modi strani.Perché abs (intmin) ~ = -intmin in matlab

+4

Controllare [complemento a due] (http://en.wikipedia.org/wiki/Two's_complement) e gamme per i numeri a 32 bit. – plesiv

risposta

9

Per numeri interi con complemento a 2 di 32 bit, intmin è 0x80000000 o, in effetti, -2147483648. Tuttavia, intmax è 0x7FFFFFFF, che è solo 2147483647. Ciò significa che la negazione di intmin sarebbe 2147483648, che non può essere rappresentata negli interi con segno a 32 bit.

MATLAB effettivamente fa qualcosa di strano. Secondo le normali regole del complemento a 2, 0 - 0x80000000 dovrebbe restituire 0x80000000. Tuttavia, secondo MATLAB, 0 - 0x80000000 = 0x7FFFFFFF. Questo dovrebbe spiegare perché il abs(intmin) = intmax è valido per MATLAB (ma non necessariamente in altre lingue).

Questa stranezza ha un effetto collaterale interessante, tuttavia: si può supporre che abs non restituisca mai un numero negativo.

+0

Grazie mille. La tua risposta è stata estremamente chiara. –

+1

MATLAB utilizza la saturazione piuttosto che il comportamento "avvolgente" che si vede in linguaggi come C. Inoltre penso che l'overflow di interi con segno in C sia * comportamento non definito * – Amro

5

Per codificare lo zero, deve esserci un'asimmetria tra gli interi del complemento a due positivi/negativi.

In effetti, viene visualizzato un overflow (saturazione) intero.

2

Per ogni tipo di dati integer, v'è un numero massimo e minimo che si può rappresentare con quel tipo:

integer_type_range

Quando il risultato di un'espressione contenente interi supera il valore massimo (o minimo) del tipo di dati, MATLAB esegue il mapping dei valori che non rientrano nel limite dell'endpoint più vicino. Questo comportamento saturation spiega cosa si sta vedendo piuttosto che un caso strano di overflow in rappresentazione binaria (che "avvolge" nel complemento a 2).

Esempio:

>> x = int8(100) 
x = 
    100 
>> x + x 
ans = 
    127