ループで小数を使うと変な誤差が出るので困っています。例えば、以下のプログラムを実行します。
for(my $i = -2; $i <= 2; $i += 0.01){ print "$i\n"; }
結果の一部だけを抜粋すると、以下のように微妙に誤差のある出力部分が所々にあります。
-0.0199999999999984
-0.00999999999999836
1.64104840827406e-15
0.0100000000000016
この誤差が非常に気になります。
とりあえず、その場しのぎで、
use POSIX;
for(my $i = -2; $i <= 2; $i += 0.01){ print floor(($i + 0.005)*100)/100 . "\n"; }
として回避していますが、根本的な解決になっていないような気がして気持ち悪い思いをしています。
質問は2種類です。
・なぜ、この誤差が生じるのでしょうか?
・この誤差を生じないようにするモジュールや、解決法などはありませんか?
No.2ベストアンサー
- 回答日時:
つい最近、別のカテゴリですが同様の質問がありました。
MSN相談箱 なぜ最後の数値が出ませんか
http://questionbox.msn.co.jp/qa2829383.html
Math::BitFloatとかMath::BigRatを使うと
解決できるかもしれません。
大変有用な回答をありがとうございました。
おかげ様で、解決できました。
問題のプログラムですが、ご提案にあったMath::BigFloatを使って以下のようにすることで解決しました。
use Math::BigFloat;
my $step = Math::BigFloat->new('0.01');
for(my $i = -0.5; $i <= 0.5; $i += $step){ print "$i\n"; }
No.3
- 回答日時:
#2ですが。
ちょっとつけたし。> Math::BigFloatを使って以下のようにすることで解決しました。
誤差の解消という面ではBigFloatを使うということで
問題ないと思いますが、ループの制御変数などに使うと
(BigFloatの処理は「重い」ので)処理速度に影響が
でます。
使いどころには気をつけてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 統計学 対数平均二乗誤差(RMSLE)について 3 2023/01/04 12:41
- 物理学 時定数で実験で求めた値と理論値に誤差が生じる理由はなんですか?自分は実験で使用した抵抗やコンデンサの 3 2022/09/26 11:32
- 物理学 測定値と理論値の誤差について 交流回路の実験でRL回路、RC回路、RLC直列回路の周波数を上げた時の 1 2022/05/22 23:37
- その他(プログラミング・Web制作) Excel の判定式で正しく判定されない場合があります。 2 2022/05/31 14:43
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- JavaScript 定積分の近似値を計算する関数composite_newton_cotesをつくりたい 1 2023/01/18 14:09
- JavaScript 最小二乗法 2 2023/01/01 20:57
- 物理学 誤差の問題についでです。 yがy=A+Bxの上に乗ると予想でき、以下の4個の測定値 (2,3.2±1 2 2023/04/25 00:54
- Amazon この場合 Amazonプライム が ピンハネ したと思われますか? 2 2023/02/03 03:27
- 統計学 信頼区間についての質問です。 6 2023/06/25 17:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数に値を代入するのに、まずu...
-
HASH(0xほげほげ)
-
Perlで use strict して our変数
-
連想配列とforeach
-
プロトタイプ宣言のワーニング...
-
Wコロン
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
子windowsからsubmit()後にclos...
-
講義でわからないのですが以下...
-
VBA他のブックから値のみ貼付す...
-
formで特定のinputを送信しない...
-
c言語 16進数の2進数への変換
-
メモリをアドレスを直接指定し...
-
どちのほうがすきですか?
-
C言語について
-
【至急!!!】python言語で本を見...
-
FindFirst を複数条件で検索
-
文字の横にプルダウンを表示さ...
-
pythonで演算子を変数に代入す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで複数の値を返す良い方法...
-
HASH(0xほげほげ)
-
10進数→2進数
-
内部処理形式が日付型 (Date) ...
-
Wコロン
-
変数に値を代入するのに、まずu...
-
Perlで自分自身の関数名を知る...
-
PerlでCabochaを呼び出すには(...
-
print <<"_HTML_"の中でサブル...
-
プロトタイプ宣言のワーニング...
-
Perlで use strict して our変数
-
Pythonのマルチプロセスでの並...
-
Perl 一定時間後にプログラムを...
-
これは動いてくれますか??
-
Net::SSH::Perlについて
-
Python 点座標表示の不具合
-
引数の値をURLのパスに配列とし...
-
Pythonのプログラミングの質問...
-
Net::Telnetでタイムアウト時間...
-
[perl] next と return 同じ意...
おすすめ情報