のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

infやnanになる条件

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

機械学習のプログラムを書いていると、infとnanの地獄に巻き込まれることが多々有ります。
正直、戦いたくはないのですが…。

こんな時に出そうなinfやnanの条件を纏めてみました。

Nan=値が数でない時に出現する。
inf=値が無限大でない時に出現する。

とりあえず、ソースコードをペタっと

infやnanのサンプル

#include <iostream>
#include <math.h>

using namespace std;

int main(int argc, char const *argv[]){
	double log_x = log(0);
	double exp_ma = exp(750);

	cout << log_x << endl;
	cout << exp_ma << endl;
	cout << 0 / 0 << endl;

	cout << exp_ma / exp_ma << endl;
	cout << log_x / log_x << endl;
	cout << exp_ma + log_x << endl;

	return 0;
}

1.logを0で割る
logを0で割るとnanが出現する。
特に機械学習アルゴリズムを組むとき要素が0になることがあるので、気をつけて実装してください。

2.ゼロディバイド
0で割るとnanが出現する。うっかり見逃しがち、割るときは十分に気をつけましょう

3.オーバーフロー
e^730乗ぐらいでオーバーフローするそうです。
これもよくやる。すぐに730超えますからね。logsumexpなる手段が世間にはあるそうで。
それを利用するとオーバーフローは超えれます。

4.無限大で計算をするとnanになる。
infをinfで割るとnanになる。ヘタすると伝播して何が何だかわからなくなる原因。
逐一調べましょう。

InfやNanの判定

次にチェックの方法です
==とかではなく isnanやisinfのマクロを使って行います

if(isnan(exp_ma + log_x)){
	cout << "出力がnanです。" << endl;
}

if(isinf(exp_ma)){
	cout << "出力がinfです。" << endl;
}