2

GNU Fortran コンパイラ (gfortran) の最新バージョンを使用して、自分の研究プロジェクトに Fortran を使用しようとしていますが、実数を処理する方法でいくつかの問題に遭遇しています。たとえば、次のコードがある場合:

program test
implicit none

real :: y = 23.234, z

z = y * 100000
write(*,*) y, z

end program

出力として得られます:

23.23999    2323400.0 

これは本当に奇妙だと思います。誰かがここで何が起こっているのか正確に教えてもらえますか? z を見ると、 y がその精度を保持していることがわかります。そのため、計算は問題にならないはずです。しかし、y の出力が指定した値と正確に一致しないのはなぜですか? 正確に同じにするためにはどうすればよいでしょうか?

4

4 に答える 4

10

これは問題ではありません。表示されるのは、コンピューター内の数値の浮動小数点表現だけです。コンピューターは実数を正確に処理することはできませんが、それらの近似値のみを処理します。これについては、What Every Computer Scientist Should Know About Floating-Point Arithmeticを参照してください。

于 2012-04-04T17:37:23.020 に答える
2

に置き換えるだけrealdouble precision、ほとんどのプラットフォームで小数点以下の有効桁数を約 6 から約 15 に増やすことができます。

于 2012-04-04T17:37:17.263 に答える
1

一般的な問題は Fortran に限定されたものではなく、別の有限精度の基数での基数 10 の実数の表現です。このコンピューター サイエンスの質問は、ここで何度も聞かれます。

特に Fortran の側面では、「real」と宣言すると、単精度浮動小数点が得られる可能性があります。型修飾子なしで定数を「23.234」と表現する場合と同様です。小数点のない定数 "100000" は整数であるため、"y" は実数変数であるため、式 "y * 100000" は整数を実数に暗黙的に変換します。

これらの問題に関するこれまでの説明については、拡張倍精度Fortran: integer*4 vs integer(4) vs integer(kind=4)およびIs There a Better Double-Precision Assignment in Fortran 90? を参照してください。

于 2012-04-04T18:51:27.383 に答える
1

ここでの問題は Fortran ではなく、実際にはまったく問題ではありません。これは、浮動小数点演算の単なる機能です。23.234 を 2 進数の「単一浮動小数点数」として表現する方法を考えると、数値を非常に多くの精度の小数にのみ保存する必要があることがわかります。

浮動小数点数について覚えておくべきことは、丸く見え、基数 10 でさえおそらくバイナリでは見えない数です。

浮動小数点のトピックの概要については、ウィキペディアの記事を参照してください。非常に完全な説明については、Goldberg による正規論文(PDF) を参照してください。

于 2012-04-05T06:26:42.010 に答える