-1

2 つの列 (最初の列は x、2 番目の列は f(x)) を持つファイルに保存された分布関数 f(x) があります。

..
1.667  0.815083333
1.668  0.810443333
1.669  0.813403333
1.67  0.810623333
1.671  0.804236667
1.672  0.805286667
...

この関数のうち、対数を引く必要があります。x のある値に対して分布が 0 になる可能性があるため、x のある値に対して対数が無限大になる可能性があります。このように-log(f(x)) 、ファイルに書き込むと、

3.894  13.8155106
3.895  13.8155106
3.896  INF
3.897  INF
3.898  INF

最終的にファイルを読み取ると、プログラムはエラーで終了します

invalid number: incomprehensible list input
apparent state: unit 17 named fort.17
last format: list io
lately reading direct formatted external IO
Aborted (core dumped)

読み取り/書き込みを処理できるようにプログラムを書き直す最良の方法は何-log(0)ですか?

4

1 に答える 1

0

私の推測では、無限大にモック値を使用するだけf(x)>epsilonepsilon、適切に低いしきい値で の場合にのみ対数を取り、それ以外の場合は適切に大きな値を使用することになります。

     do ir = 0, nbb
        if (targetdbb(ir) .gt. 1.d0e-10) then
           eibb(ir) = -log(targetdbb(ir))
        else
           eibb(ir) = 100000
        endif
     enddo

f(x)=0これは、との間の違いを失うことを受け入れることができる場合、問題を解決するアドホックな実装ですf(x)<1e-10

于 2013-05-26T15:02:41.800 に答える