2016-11-29 2 views
3

Je ne peux pas comprendre pourquoi la division par 0 donne des résultats différents dans les deux cas suivants. amort est une fonction qui calcule un programme d'amortissement constant. La seule chose que nous soucions est maintenant que le dernier élément de A est exactement 0.Division Matlab par 0: Inf ou -Inf

amort = @(r,M) ((1+r).^(0:M)' - (1+r).^M) ./ (1-(1+r).^M) 

A = amort(0.03, 20); 

>> A(end)==0 
ans = 
    1 

Ce qui semble étrange est la suivante:

>> 1/0 
ans = 
    Inf 
>> 1/A(end) 
ans = 
    -Inf 

Cependant

>> sign(A(end)) 
ans = 
    0 
>> 1/abs(A(end)) 
ans = 
    Inf 

Comment est-ce possible et pourquoi? Y a-t-il une sorte de "signe" caché?

+1

Copie possible de [Pourquoi Gnu Octave a-t-il des zéros négatifs?] (Http://stackoverflow.com/questions/2109755/why-does-gnu-octave-have-negative-zeroes) – excaza

+0

Alors que le doublon fait référence à Octave, la réponse acceptée concerne MATLAB et le format IEEE-754. – excaza

+1

'A (fin)' est un zéro négatif. 'fprintf ('% f \ n', A (fin))' retourne '-0.000000' – excaza

Répondre

6

A(end) a en fait son bit de signe (c'est-à-dire qu'il est négatif à zéro). Essayez d'utiliser num2hex pour voir la représentation hexagonale:

>> a = -0 
a = 
    0 % Note the sign isn't displayed 

>> num2hex(A(end)) 
ans = 
8000000000000000 

>> num2hex(a) 
ans = 
8000000000000000 % Same as above 

>> num2hex(0) 
ans = 
0000000000000000 % All zeroes 

>> 1/a 
ans = 
    -Inf 

Notez qu'un -0 est affiché comme 0, mais en réalité a son bit de signe. D'où le résultat -Inf.

Notez également cette explication de la fonction sign (Souligné par):

Pour chaque élément de X, signe (X) renvoie 1 si l'élément est supérieur à zéro, 0 si elle est égale à zéro et -1 si est inférieur à zéro.

Depuis -0 n'est pas inférieur à zéro, mais égal à 0, sign retours 0.

+0

Je vois - c'est utile. Devinez pourquoi le bit de signe est mis à zéro alors? Cela dépend-il de la précision/approximation de la machine pour effectuer les calculs demandés par 'amort'? Puis-je empêcher ces situations? – Giuseppe

+2

@Giuseppe: Dans la fonction 'amort' de votre exemple, le numérateur du dernier élément vectoriel sera 0 mais le dénominateur sera' (1-1.03^20) ', soit environ -0,8061. Si vous divisez 0 par un nombre négatif, vous obtenez -0. Si vous permutez les termes dans le numérateur et le dénominateur (c'est-à-dire multipliez par -1 par le haut et le bas), vous pouvez l'éviter. – gnovice