1

fortran95 言語を学ぶことにしました (理由は重要ではありません)。しかし、初心者なので、説明できない奇妙な問題に遭遇したため、助けが必要です。

私は挿入ソートアルゴリズムを持っています:

subroutine insertion_sort_REAL4(array, array_len)
   implicit none
!parameners
   integer :: array_len
   real (kind=4), dimension(array_len) :: array 
!variables
   integer :: i,key,hole_pos
   do i = 0,array_len
      key = array(i)
      hole_pos = i;
      do while ((hole_pos > 0.0) .and. (key < array(hole_pos - 1)))
         array(hole_pos) = array(hole_pos - 1)
         hole_pos = hole_pos - 1
      end do
      array(hole_pos) = key
   end do
   return
end   

そして、メインプログラム(抜粋)があります:

real (kind = 4), dimension(3) :: x
x(1) = 3.1
x(2) = 4.3
x(3) = 5.4
write(*,*) 'Array = ',x
call insertion_sort_REAL4(x,3)
write(*,*) 'Array = ',x  

最初のwriteステートメントが出力されます

Array =    3.09999990       4.30000019       5.40000010 

数字が少し変わったのはなぜですか?fortran95 はデフォルトで IEEE754 標準を使用しませんか?

しかし、私はわずかな変化に耐えることができるとしましょう。2番目のwriteステートメントが出力されます

Array =    3.00000000       4.00000000       5.00000000  

数値が丸められたのはなぜですか?それは本当に私を悩ませており、「書き込み」ステートメントをフォーマットしても何の役にも立たず、Google 検索もあまり役に立ちませんでした。Fortran は C のものなので、インターネット上にはそれほど多くの情報はないと思います。助けてくれてありがとう!

4

2 に答える 2

3

「3.1」などの 10 進数は、有限長の 2 進数では正確に表現できない可能性があります。ソース コード ステートメントx(1) = 3.1により、コンピューターはその 10 進数を 2 進数に変換して格納します。このステートメントwrite (*, *) x(1)により、コンピューターはこの 2 進数値を取得し、10 進数に変換します。"3.1" は有限長の 2 進数では正確に表現できないため、10 進数に変換しても "3.1" は正確に復元されません。これは、「3.09999990」の出力を説明しています。これは Fortran 固有のものではありませんが、有限精度の浮動小数点演算に一般的です。

もう 1 つの問題として、keyはソート サブルーチンで整数として宣言されているため、実数が整数に丸められています。完全なコンパイラ警告をオンにしてあなたのプログラムをコンパイルしたとき、gfortran はこれを通知してくれました。

gfortran を使用する場合は、次のコンパイラ オプションを試してください-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace。また、プログラムに添字エラーがあることもわかります。

于 2013-09-21T20:05:26.447 に答える