2016-04-11 11 views
0

私はC++(かつ効率的)で良いシグモイド関数を計算するためにしようとしています。だから私のような何かしなければならない:問題はXは大きな(または小さな)になったときに、ある
1/(1 + exp(-x))C++非常に少ない数に1を加えますか?

を、1 + eの結果は
1 + exp(-30) = 1
、例えば0または1

することになります しかし、これは間違っている...

はどのように簡単かつ効率的に非常に小さい(または大きい)番号を追加することができますか?私が使用しています

データ型

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

ありがとう:ここでは、二重

コードスニペットです!

+1

どのデータ型を使用していますか? – NathanOliver

+0

ダブル、申し訳ありません... –

+0

は、正確な答えをあなたのコードを表示します。 –

答えて

9

私はあなたがcoutの精度を設定する必要があると思う:

#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; 
} 

出力:

1.000000000000093480778673438181 

注:人のようはコメントで指摘している、出力の一部は(ノイズでありますそれは当時、私は考慮しなかった)。私はたいてい、setprecisionに任意の数値を入れることができることを実証しようとしていました。

これは二重の1に保存することができる情報の最大量に関係しています。ビットの一部は指数に使用され、一部は実際の指数に使用されます。より正確な方法は、(精度を設定せずに)このような番号を印刷するには、次のようになります。

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

出力:

1+9.35762e-14 

まだその実際の値との二重の保存の問題を残して。しかし、それは可能であり、ウィキペディアにはこれを助けるライブラリのリストがあります:Link。関連記事にもいくつかの説明があります。

+0

[OK]を、それは働いていた、しかし、私は、標準の精度を使用して、それを見ることができなかったので? ^^おかげ –

+1

あなたが本当に浮動小数点を理解したい場合は、少なくとも計算機イプシロンを理解することから始めなければなりません。ウィキペディアでそれを見て、ダブルは1.11e - 16のマシンイプシロンを持っています。 –

+2

ええと、その出力の数字はほとんどノイズです。約15桁を超えるとノイズが発生します。 –

関連する問題