2016-05-05 31 views
0

Ich habe ein Array von double:Log Anrufe Rückkehr NaN in C

double theoretical_distribution[] = {1/21, 2/21, 3/21, 4/21, 5/21, 6/21}; 

Und ich Computer versuche es Entropie:

double entropy = 0; 

for (int i = 0; i < sizeof(theoretical_distribution)/sizeof(*theoretical_distribution); i++) { 
    entropy -= (theoretical_distribution[i] * (log10(theoretical_distribution[i])/log10(arity))); 
}  

aber ich NaN bin immer ich das überprüft haben Teil

(theoretical_distribution[i] * (log10(theoretical_distribution[i])/log10(arity))) 

Und fand es NaN selbst zurück, so dass ich davon ausgehen, es ist der Schuldige, aber alle es angenommen hat, ist ein einfacher Basis konv ersion des logs? Fehle ich etwas Detail über die Mathematik davon?
Warum bewertet es zu NaN.

+4

'1/21' ->' 1.0/21' dito. – BLUEPIXY

+1

Integer-Division schneidet ab, was zu 0 führt. Log von 0 ist NaN. –

+0

@Mark Ransom "Log von 0 ist NaN" oder vielleicht -INF. Der Rest der OP-Gleichung macht das NaN. – chux

Antwort

3

Sie übergeben 0 an die log10 Funktion.

Dies liegt daran, dass Ihr Array theoretical_distribution mit konstanten Werten gefüllt wird, die sich aus ganzzahligen Berechnungen ergeben, die alle einen Nenner haben, der größer als der Zähler ist.

Sie haben wahrscheinlich Floating-Berechnungen beabsichtigt, also machen Sie mindestens einen der Zähler oder Nenner eine floatende Konstante.

+0

Ja, das war's! Vielen Dank. Auch Shoutout zu @BLUEPIXY, der am schnellsten reagierte. – Scy