2016-10-31 8 views
0

を計算するときに、私は非2の累乗の数のFP表現は常にエラーを持っていますが、この実現...PERLの精度誤差ベース-10ログ特性

% perl -e 'print int(log(1000)/log(10))."\n"' 
2 
% perl -e 'print (log(1000)/log(10))."\n"' 
3 
% perl -v 

This is perl 5, version 22, subversion 2 (v5.22.2) built for darwin-thread-multi-2level 

...オイ...何をだろうベース10(または任意のベース)の対数の特性(整数部分)を見つけるための回避策ですか?ありがとう!

EDIT:POSIX :: floor()と同じ結果が得られます。だから問題は、私が丸め誤差に遭遇している場合、対数の特性をどのように計算するのですか?

+0

['int'](http://perldoc.perl.org/functions/int.html)は丸められません。 'sprintf"%.N "、$ float'(または' printf')を使うことができます – zdim

+0

はい、どうすれば問題を解決できますか? POSIX :: float()は丸めて同じ結果を返します。 – PeterT

+0

あなたが探している出力と動作は何ですか? – dawg

答えて

3

あなたはに四捨五入されていない2.999....前に、デフォルトの小数点以下の桁数よりも多くを必要とする3

試してみてください。

$ perl -e 'print int(2.999)."\n"' 
2 

$ perl -e 'printf "%.17f\n",log(1000)/log(10)' 
2.99999999999999956 

そしてintがフロートの床であります


フローティング部分と整数部分を処理する標準的な方法浮動小数点数はPOSIXモジュールに含まれています。

あなたはmodfと整数部とフロート部を分離することができます:

$ perl -MPOSIX -e '($fp, $ip)=modf(3.14); print "$fp $ip\n"' 
0.14 3 

それとも、あなたのケースで:

$ perl -MPOSIX -e '($fp, $ip)=modf(log(1000)/log(10)); printf "%.17f %i\n",$fp,$ip ' 
0.99999999999999956 2 

ます。また、標準のためceilfloorfxexp、およびroundを使用することができますこれらの関数のバージョンlogであるため、

$ perl -MPOSIX -e 'use bigint; ($fp, $ip)=modf(log(1000)/log(10)); printf "%.45f %i\n",$fp,$ip' 
0.000000000000000000000000000000000000000000000 3 

または:プラグマとして、

$ perl -Mbignum -e 'printf "%.30f\n",log(1000)/log(10)' 
3.000000000000000000000000000000 

または:精度は、あなたの懸念は、ある

場合は潜在的に簡単に部分的な修正はbignumライブラリを使用することですtranscendental functionには、シンボリック数学パッケージを使用します。

+0

はい、どうすれば問題を解決できますか? – PeterT

+0

POSIXについて編集を参照してください – dawg

+0

modfを表示してくれてありがとう。申し訳ありませんが、密度が高いので、int()のlog(x)/ log(10)x = 1000は常に3ちょうど私はちょっと混乱している必要があります。また、x = 1001の場合、整数部分も3でなければなりません。そして、x = 999でなければなりません。正しい期待答えを提供する連続的な解決策は何ですか? – PeterT

関連する問題