9
votes

Pourquoi ABS (INTMIN) ~ = -INTMIN dans MATLAB

EDU>> intmin 
    ans =

    -2147483648

EDU>> abs(intmin)

     ans =

     2147483647
How is this possible? There must be some sort of overflow or the definitions of these functions are mingling in strange ways.

1 commentaires

Vérifiez Two's Complément et gammes pour des nombres 32 bits.


3 Réponses :


5
votes

Pour encoder zéro, il doit y avoir une asymétrie parmi les entiers de complément positif / négatif.

En effet, vous voyez un débordement entier (saturation).


0 commentaires

9
votes

pour le complément de 2 a signé des entiers de 32 bits, INTMIN est 0x80000000 ou même -2147483648 . Cependant, intmax est 0x7fffffff , qui n'est que 2147483647 . Cela signifie que la négation de INTMIN serait 2147483648 , qui ne peut pas être représenté dans des entiers signés à 32 bits.

Matlab fait effectivement quelque chose d'impair. Sous les règles normales du complément de 2, 0 - 0x80000000 doit donner 0x80000000 à nouveau. Cependant, selon MATLAB, 0 - 0x80000000 = 0x7FFFFFF . Cela devrait expliquer pourquoi ABS (INTMIN) = INTMAX est contenant pour MATLAB (mais pas nécessairement dans d'autres langues).

Cette bizarrerie a un effet secondaire intéressant, cependant: vous pouvez supposer que ABS ne renvoie jamais un numéro négatif.


1 commentaires

MATLAB utilise la saturation plutôt que le comportement "enveloppant" que vous voyez dans des langues telles que C. En outre, je pense que le débordement des entiers signés en C est comportement indéfini



2
votes

pour chaque Type de données entier est un plus grand nombre et plus petit que vous pouvez représenter avec ce type:

INTEGER_TYPE_RANGE

Lorsque le résultat d'une expression impliquant des entiers dépasse la valeur maximale (ou minimale) du type de données, MATLAB mappe les valeurs situées en dehors de la limite au point final le plus proche. Ce Saturation Comportement explique ce que vous voyez plutôt qu'un cas étrange de Overflow en représentation binaire (ce qui" enveloppe "dans le complément de 2).

Exemple: xxx


0 commentaires