2012-04-20 6 views
0

私はPerlを使用してミニ検索エンジンを作成しています。そうすることで、ベース10にログを持つ式を使用しています。しかし、 :エラー:-9.4351e + 0.007のログを取ることができません

-9.4351e + 0.007のログを取ることはできません。

どこからこのエラーが発生しているのかを追跡することは不可能です。私はこの事件を無視したい。これはPerlでどのように処理できるのですか?ベース10にログを見つけるためのサブルーチンは、このようなものです:

sub log10 { 
my $n=shift; 
return log($n)/log(10); 
} 

だから、おそらく私はとてもので、値はログを見つけるいけない場合と言うのチェックを探しています。

+2

原因を見つけることは不可能ではなく、アルゴリズムのバグを示しています。あなたはそれを飲み込むためにクルーザーを入れるよりも、エラーを修正する必要があります。 –

+2

'' print log '-9.4351e + 0.007''を書くと、 "Argument" -9.4351e + 0.007が "数値ではありません"となります。実際にここで何が起こっているのですか?パラメータの真の価値は何ですか? – Borodin

+1

'perl -MScalar :: Util -e 'print Scalar :: Util :: looks_like_number(q(-9.4351e + 0.007))、" \ n "''は '0'(偽)を出力します。あなたは数字ではないもののログを取ることはできません。あなたの問題は指数にあります。指数表記法は、浮動小数点指数を考慮して設計されていません。 perldoc perlnumberを参照してください。 – DavidO

答えて

6

負数のログを取ることはできません。

詳細はWolfram MathWorldを参照してください。

+0

Perlの数値は0.007の指数を持つことはできません。負の数ではありません。単なる文字列です。 'print -9.4351e + 0.007'を実行すると' print -9.4351e + 0 'が実行されます。出力は「-9.4351」と「7」の連結になります。 – Borodin

+2

@Borodin 'print 0 +" - 9.4351e + 0.007 "'は負の数で '-9.4351'のように数えられます:) – hobbs

1

ln y」は、「xexと等しく、yと一致する」という意味です。

eは、正の数(2.17828に近い)なので、何度でも何度でも何かを乗算しても、負の数値は決して得られません。

負の数のログは見つかりません。


ボロディンも-9.4351e+0.007はパールによって数値として認識されていないことを指摘しているように。

>perl -wE"say 0+'-9.4351e+0.007'" 
Argument "-9.4351e+0.007" isn't numeric in addition (+) at -e line 1. 
-9.4351 
+0

...ここでは複素数を考慮していないので、 – Borodin

2

別に負である値から、文字列-9.4351e+0.007は、整数であることができる浮動小数点定数の指数部として有効な番号ではありません。

log10関数に文字列を渡す必要があります。Perlはこの形式の数値について文句を言わないためです。

関数が呼び出される前に何かが間違っているので、これらの値のソースを調べる必要があります。また、エラーなしでlogに渡すことができる値であっても間違った結果をもたらすでしょう。

関連する問題