宮本@東北大 と申します。
g77(0.5.20, 0.5.22)を使って、以下のような
プログラム(test.f)
double precision ded
ded=dble(-999.9)
write(6,'(f17.10)') ded
stop
end
を
g77 test.f
の様に、コンパイルし実行すると、
-999.9000244141
のように出力されてしまいます。
-999.9000000000
と出力させるには、どの様にすれば良いのでしょうか?
良く分かりませんが、とりあえず
f2c test.f
gcc test.c -lf2c -lm
とやると、
-999.9000000000
と出力されました。また、上のプログラム(test.f)の2行目の
ded=dble(-999.9)
を
ded=-999.9
とすると、f2cによって作られたCプログラム(test.c)中では
ded = -999.9;
であったのが
ded = (float)-999.9;
^^^^^^^
となり、
-999.9000244141
と出力されるようになります。
g77でも、ちゃんと倍精度を利用できるようにするのには
どの様にすれば良いかお教え下さい。
> g77でも、ちゃんと倍精度を利用できるようにするのには
> どの様にすれば良いかお教え下さい。
double precision ded
- ded=dble(-999.9)
+ ded=-999.9D0
write(6,'(f17.10)') ded
dble は所詮関数であって(C の cast に相当するものではない)、
-999.9 が単精度で与えられている以上、g77 の動作は言語仕様に
反してないと思います。定数の代入で勝手に型整合を採るのは
Fortran77 コンパイラの拡張仕様で、(詳しくは知らないんですが)
Fortran90 ではもっと厳密に扱うんじゃないでしょうか。手近な
コンパイラで試した所、Digital UNIX 4.0, Solaris 2.6 共に、
f77 では -999.9000000000、f90 では -999.9000244141 と表示
されました。
この辺の事情は g77.info の Language - Constatns 辺りに書いて
あったと思います。g77 を f77 コンパイラとして使うのであれば、
(世に流布している f77 コンパイラと較べると他にも色々“クセ”
が有りますから) info を一読される事をお薦めします。
---------
岡村 弘之 oka...@phys.s.u-tokyo.ac.jp
東京大学理学部物理 oka...@timshel.riken.go.jp
(↑に居るのもあと二日)
>> ded=dble(-999.9)
>> write(6,'(f17.10)') ded
>> -999.9000244141
>> -999.9000000000
>> g77でも、ちゃんと倍精度を利用できるようにするのには
>> どの様にすれば良いかお教え下さい。
結論から言えば
ded=-999.9d0
でdedに-999.9000000000が入ります。
「d」指数を付けてない実定数は単精度型です。
dbleで型変換しても値は変わらないはずなので、
g77の方が正しい動作をしていると思います。
--
新崎@東大総文
ara...@mns2.c.u-tokyo.ac.jp