12

Fortran のフォーマット ステートメントについて頭を悩ませています。

出力をフォーマットせずに、これが私が行うことです(ループ内で、これは数回発生します):

write(*,*) t*1E9

tこちらですreal*8。出力はまさに私が期待するものです-0.1の増分で、いくつかの丸め誤差があります:

0.0000000000000000     
0.10000000000000001     
0.20000000000000001     
0.29999999999999999     
0.40000000000000002     
0.50000000000000000     
0.59999999999999998     
0.69999999999999996     
0.79999999999999993     
0.89999999999999991     
0.99999999999999989

ここで、format ステートメントを追加してみます。

write(*, '(F1.2)') t*1E9

そして(他のすべては同じです)代わりに、出力にアスタリスクのみが表示されます:

**
**
(etc...)

これがどのように機能するかを調べてみましたが、なぜこれが起こっているのかわかりません。数字のスペースを増やしてフォーマットを試しました(F15.151行あたりのアスタリスクを増やすだけです)、フォーマットステートメントを独自のラベル付き行に移動しようとしました...出力が得られないようですお気に入り。

ここで何が欠けていますか?

4

1 に答える 1

18

Fortran 形式のステートメントは次のように定義されます。

Fw.dここで、w は合計で使用される文字数、d は小数点以下の文字数です。ここでは、全体で 1 文字幅の float が必要であり、小数点以下 2 文字が必要であることを伝えていますが、これは明らかに正しくありません。たとえば、合計 4 文字で小数点以下 3 桁の float を取得するには、次のように記述します。

write(*, '(F4.3)') t*1E9

http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.htmlを参照してください。

また、アスタリスクは、記載されている形式で数値を表示できないことを示していることに注意してください。

編集:

以下のジョージからのコメントを追加します。

「E フォーマットの場合、フィールド幅は小数点以下の桁数よりも少なくとも 7 大きい必要があります。たとえば、E15.8 です。指数には 4 つ、リード 0 には 2 つ、可能性のある '-' には 1 つです。通常、もう 1 つの余分なスペースを追加します。数字がくっつかないように、E16.8"

于 2013-03-28T15:13:11.410 に答える