16

必要に応じて先行ゼロを使用してテキストファイルに書き込む必要のある10進数がいくつかあります。私はこれについていくつかの調査を行いました、そして私が見たすべては次のようなものを示唆しています:

  REAL VALUE
  INTEGER IVALUE

  IF (VALUE.LT.0) THEN
    IVALUE = CEILING(VALUE)
  ELSE
    IVALUE = FLOOR(VALUE)
  ENDIF
  WRITE(*,1) IVALUE, ABS(VALUE)-ABS(IVALUE)
1 FORMAT(I3.3,F5.4)

私が理解しているように、IFブロックとABSパーツは、-100 <VALUE <1000のすべての値に対してこれが機能することを許可する必要があります。を設定VALUE = 12.3456すると、上記のコードは出力として「012.3456」を生成するはずです。ただし、のようなものがある場合はVALUE = -12.3456、出力として「(3アスタリスク).3456」が表示されます。ステートメントに十分な文字が指定されていない場合、通常はアスタリスクが表示されますがFORMAT、この例では3文字で十分です(「-」の場合は1文字、「12」の場合は2文字)。のようなものでこれをまだテストしていませんがVALUE = -9.876、出力は「-09.8760」になると思います。

これがどのように機能するかについての私の理解に何か問題がありますか?それとも、私が違反しているこのテクニックの他の制限はありますか?

更新:さて、私はこれをもう少し調べました、そしてそれは負の値とI3.3フォーマットの組み合わせのようです。VALUEが正で、私がを持っている場合I3.3、期待どおりに先行ゼロが配置されます。VALUEが負でI3、フォーマットとしてのみ使用している場合、正しい値が出力されますが、負の後にゼロが埋め込まれるのではなく、負の符号の前にスペースが埋め込まれます(したがって、-9.8765は「-9.8765」として出力されます。しかし、その先頭のスペースは、私が.txtファイルを使用しているものを壊しているので、受け入れられません)。

4

3 に答える 3

17

問題は、整数データ編集記述子にあります。I3.3少なくとも3桁が必要で、フィールド幅は3桁だけです。マイナス記号の場所はありません。またはを使用しますI4.3。Fortran95以降では、I0.3

編集への回答:使用してくださいI0.3。必要最小限の文字数を使用します。

しかし最後に、あなたはおそらくこれが欲しいだけです:WRITE(*,'(f0.3)') VALUE

于 2013-01-29T18:14:19.707 に答える
0

もちろん、少し変更することで探しているものを手に入れることができました

  REAL VALUE
  INTEGER IVALUE

  IF (VALUE.LT.0) THEN
    WRITE(*,1) FLOOR(ABS(IVALUE)), ABS(VALUE)-FLOOR(ABS(VALUE))
1   FORMAT('-',I2.2,F5.4)    
  ELSE
    WRITE(*,2) FLOOR(VALUE), ABS(VALUE)-FLOOR(BS(VALUE))
2   FORMAT(I3.3,F5.4)
  ENDIF

しかし、これは非常に不格好な感じがします。実際には、同じ行に複数の値を書き込もうとしています。これにより、IFブロックが非常に乱雑になったり、カーソルが複雑に移動したりするため、可能な限り避けたいと思います。

于 2013-01-29T18:19:23.873 に答える
0

猫の皮を剥ぐ別の方法として..データに対して算術演算を行うのではなく、次の形式で作業することをお勧めします。

character*8 fstring/'(f000.4)'/
val=12.34
if(val.gt.1)then
    write(fstring(3:5),'(i0)')6+floor(log10(val))
elseif(val.lt.-1)then
    write(fstring(3:5),'(i0)')7+floor(log10(-val))
elseif(val.ge.0)
    write(fstring(3:5),'(i0)')6
else
    write(fstring(3:5),'(i0)')7
endif
write(*,fstring)val

文字関数をサポートする最新のFortranを楽しむために、それを関数にまとめて、次のような構成にすることができます。

write(*,'('//fstring(val1)//','//fstring(val2)//')')val1,val2
于 2013-01-29T19:07:12.037 に答える