導入
数値計算の世界では、ループ処理は避けて通れません。プログラムを書いていると「計算結果が目標の精度に達するまで繰り返したい」という場面によく遭遇します。そんなとき、回数が事前に決まっていないループを処理するために役立つのが「DO WHILE」構文です。本記事では、この構文の仕組みと、効率的なコードを書くための注意点を解説します。
基礎知識
プログラミングにおける「反復(ループ)」には、大きく分けて2種類あります。
一つは「回数が決まっているループ(DOループ)」、もう一つは「条件が満たされている間だけ繰り返すループ(DO WHILEループ)」です。
DO WHILEループは、指定した条件式が「真(True)」である限り、中の処理を何度も実行します。例えば、「誤差が許容範囲内に収まるまで計算を繰り返す」といった、終了条件が計算結果に依存する場合に非常に有効な手法です。
実装/解決策
DO WHILEを正しく使うためには、ループの入り口で評価される「条件」が、どこかのタイミングで必ず「偽(False)」になるように設計することが重要です。もし条件がずっと「真」のままだと、プログラムが止まらない「無限ループ」に陥ってしまうからです。
数値計算においては、通常、収束判定値(イプシロン: eps)を定義し、現在の誤差がそれを下回るまでループさせるのが定石です。
サンプルプログラム
以下は、数値計算でよくある「反復法」を模したサンプルコードです。そのままコピーして動作を確認してみてください。
! 許容誤差を定義(1e-6)
real(8), parameter :: eps = 1.0d-6
real(8) :: err = 1.0d0
real(8) :: x = 2.0d0
! 誤差が許容範囲(eps)より大きい間、ループを継続する
do while (abs(err) > eps)
! 何らかの計算処理(ここでは簡易的に誤差を半分にする)
err = err / 2.0d0
x = x + err
! 現在の状況を出力
print , "現在の誤差: ", err
end do
print , "計算終了。最終値: ", x
応用・注意点
最後に、数値計算エンジニアとしての重要なアドバイスです。
DO WHILEは「便利な反面、多用には注意」が必要です。
現代のコンパイラは、回数が確定している「DOループ」に対しては、ループ展開(処理を並列化して高速化する最適化)を非常に効率よく行います。一方で、DO WHILEはループ回数が実行時にしか分からないため、コンパイラが最適化をかけるのが難しく、計算速度が低下する場合があります。
現場での回避策:
1. 最大試行回数を設ける:無限ループ防止のため、`do while (条件 .and. count < max_iter)` のように、念のため最大回数で強制終了する安全策を入れましょう。
2. 可能ならDOループに書き換える:もしあらかじめ「最大100回は繰り返す」といった見通しが立つなら、DOループを使って回数を指定し、ループ内で `if (条件) exit` を使う方が、計算速度の面では有利になることが多いです。
これらを使い分けることで、安全かつ高速な数値計算プログラムを作成できるようになります。ぜひ意識してみてください。

コメント