如何在Fortran 77中处理INF?

时间:2013-05-26 15:02:42

标签: fortran77

我有一个分布函数f(x),保存在一个有两列的文件中(第一列是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)的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我的猜测是只使用无穷大的模拟值,这样我们只在f(x)>epsilon时采用对数,epsilon具有适当的低阈值,否则使用适当的大值。

     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)=0f(x)<1e-10之间的任何差异。