
fortranで以下のようなプログラムにてxに1.0^-6を代入し、
その中身を表示しました。
---------------------------------
program test
real(8) :: x = 1.0d-6
write(*,*) x
write(*,*) x * 1.0d6
write(*,*) int(x * 1.0d6)
end program test
---------------------------------
しかし、結果は以下のようになり、
0.999999999999999955^-6となってしまいます。
さらに、やっかいなことに10^6倍して
整数型に変換しても0と認識されてしまうのです。
----------------------------------
$ ./a.exe
9.99999999999999955E-007
1.00000000000000000
0
----------------------------------
変数の型も倍精度で宣言し、定数も倍精度(d付き)で
代入しているはずなのですが、なぜこのような現象が
起きるのでしょうか。
ご存知の方いましたら教えて頂けると助かります。
なお、コンパイルはgfortranで行っています。
No.2ベストアンサー
- 回答日時:
fortranは使ったことがないのですが、これはプログラミング言語全般で一般的に見られる現象と思います。
すなわち、小数の値に誤差が出る原因はなにか?ということですね。小数は、コンピュータでは完全に正しく表現できません。誰でも思いつくのが循環小数の存在です。例えば、10 / 3は、0.33333……ですが、コンピュータでは適当な桁で終わってしまいます。0.33333という具合ですね。これに3をかけると0.99999で、1には戻りません(まぁ、最近の言語では循環小数を認識しちゃんと1に戻るものもありますが、考え方として、ということです)。この問題は、誰でも理解できることと思います。
この問題が、2進数でも起こります。すべての数値は、コンピュータ内部では2進数として処理されています。やっかいなのは、2進数と10進数では微妙にその性質が異なる点です。2進数では、1を10のn乗で割った値は循環小数になるのです。1 / 10は10進数では0.1で割り切れますが、2進数では循環小数になり割りきれません。先の10 / 3と同様、適当なところで切り捨てられ、不正確な値として保管されます。このため、1 / 10の値に10をかけても0.99999……となり、1には戻らないのです。
この現象が、ご質問のケースでも内部で起こっているのだと思います。
な、なるほど!!
そういうことだったのですね!
非常に的確で丁寧なご説明ありがとうございます。
とてもすっきりしましたm(_ _)m
いやー、こんなに即答して頂けるとは、・・・すごいですね!!
No.1
- 回答日時:
どんな精度を使おうとも、有限の桁で処理している限り、10進数⇔2進数の変換の際に誤差が生じます。
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95% …
の「精度」のところに簡単に書いてあります。
「浮動小数点 誤差」「浮動小数点 精度」といったキーワードで検索するとたくさん解説がみつかります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- ドライブ・ストレージ HDDのチェック方法 6 2022/05/04 09:49
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) ExcelVBAで、型が一致しませんのエラーについて 3 2023/06/20 09:51
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c languageで 簡単な質問があ...
-
有効数字について 以前質問をし...
-
float.h のテスト結果がおかしい
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
16進数 加算 減算 C言語
-
除算を使わずに10で割りたい。
-
乱数について
-
三角関数、逆三角関数の算出方...
-
”/”を使わずに割り算したいんで...
-
floatの有効桁数
-
計算の丸め誤差の解消について
-
2038年問題 日付算出
-
MATLABでの行列の全要素の和
-
C言語プログラミングにて、arct...
-
2進数の足し算(C言語)
-
C言語でセルオートマトンを作成...
-
ExcelのINT関数の計算結果がお...
-
Excel 計算結果誤差
-
VB6のFIX関数での誤差について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelでPC(パソコン)によって...
-
O(n log n)について2
-
有効数字について 以前質問をし...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
EXCELの関数"STDEV(標準偏差)"...
-
三菱シーケンサ(Aシリーズ)で...
-
VB.net Double と...
-
計算の丸め誤差の解消について
-
除算を使わずに10で割りたい。
-
2進数の足し算(C言語)
-
16進数 加算 減算 C言語
-
”/”を使わずに割り算したいんで...
-
CRCの計算方法について
-
VB6.0での小数点の扱いについて
-
VBAでミリ秒まで出力する方法
-
時刻の比較
-
2進数データのビット演算
-
教えて小数点の比較!(C言語)
-
C言語 型変換のタイミング
おすすめ情報