2016-04-11 9 views
0

Ich versuche nur eine gute Sigmoid-Funktion in C++ (und effizient) zu berechnen. Also muß er noch etwas tun:
1/(1 + exp(-x))C++ Hinzufügen von 1 zu sehr kleine Zahl?

Das Problem ist, wenn X groß wird (oder auch klein), das Ergebnis der 1 + e dreht 0 oder 1

Zum Beispiel sein,
1 + exp(-30) = 1
Aber das ist falsch ...

Wie können wir sehr kleine (oder große) Zahlen einfach und effizient hinzufügen?

Datentyp ich verwende: Doppel

Hier ist der Code-Schnipsel:

double Quaternion::sigmoidReal(double v){ 
    return 1.0/(1.0 + exp(-v)) ; 
} 

Dank!

+1

Welche Datentypen verwenden Sie? – NathanOliver

+0

double, sorry ... –

+0

Zeigen Sie Ihren Code für eine präzise Antwort. –

Antwort

9

Ich denke, man die Präzision der cout festlegen müssen:

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::cout << std::fixed; 
    std::cout << std::setprecision(30); 
    std::cout << (1 + exp(-30)) << std::endl; 
    getchar(); 
    return 0; 
} 

Ausgang:

1.000000000000093480778673438181 

Hinweis: Wie die Menschen in den Kommentaren erwähnt haben, einen Teil des Ausgangs ist Rauschen (was ich damals nicht bedacht habe). Ich habe meistens nur versucht zu demonstrieren, dass man eine beliebige Nummer in setprecision setzen kann.

Dies hat mit der maximalen Menge an Informationen zu tun, die in 1 Doppel gespeichert werden kann. Ein Teil der Bits wird für den Exponenten und ein Teil für die tatsächlichen Ziffern verwendet. Ein genauer Weg wäre, die Zahl so drucken (ohne die Präzision Einstellung):

std::cout << 1 << "+" << exp(-30) << std::endl; 

Ausgang:

1+9.35762e-14 

das immer noch das Problem Blätter einen Doppel mit dem tatsächlichen Wert zu speichern . Es ist jedoch möglich, und Wikipedia hat eine Liste von Bibliotheken, die dabei helfen: Link. Der verwandte Artikel hat auch etwas mehr Erklärung.

+0

Ok, es funktionierte, aber ich konnte es nicht mit der Standardpräzision sehen? ^^ Danke –

+1

Wenn Sie Floating-Point wirklich verstehen wollen, sollten Sie zumindest damit beginnen, die Maschine epsilon zu verstehen. Schlagen Sie es in Wikipedia nach, ein Doppel hat Maschine Epsilon von 1.11e-16. –

+2

Ähm, die Zahlen in diesem Ausgang sind meist Rauschen. Sobald Sie mehr als 15 Stellen haben, sehen Sie Rauschen. –