OpenCAE Hobby Lab
OpenCAE Hobby Lab

Copilot+PCの調査(第5報)倍精度計算実行可否

Snapdragon X Eliteで問題なく倍精度計算できるか確認した。

確認はFortranコードを使用した。

コードはこちらのコードをお借りした。

Fortran 数値計算入門: 誤差について

数値計算プログラムを作成するにあたって「誤差」についてまず知っておく必要があります。 ここでは実際にまず誤差を体感していただきます。

www.nag-j.co.jp

単精度と倍精度の結果の違い

まずは単精度で計算する。

program gosa
  implicit none
  integer i
  real delta, time
  delta = 0.1
  time = 0
  do i = 1, 1000
    time = time + delta
  end do
  print '("time = ", f18.13)', time
end program gosa

結果は次のようになった。正しい答えは100となる。

time =   99.9990463256836

次に倍精度で計算する。

program gosa
  implicit none
  integer i
  double precision delta, time
  delta = 0.1d0
  time = 0d0
  do i = 1, 1000
    time = time + delta
  end do
  print '("time = ", f18.13)', time
end program gosa

結果は次のようになった。

time =   99.9999999999986

倍精度で計算することで誤差が少なくなっていることがわかる。

倍精度変数への数値の代入

次に倍精度変数に単精度の数値を代入してみる。

  double precision a
  a = 1.23
  print *, a
  end

実行結果は次のようになり、誤差が乗っている。

1.2300000190734863

次に倍精度の指定をした数値を代入する。

  double precision a
  a = 1.23d0
  print *, a
  end

結果は次のようになり、誤差がないことがわかる。

1.2300000000000000

まとめ

特に問題なく倍精度の計算ができることが分かった。

hammamania.tech