我有一个分布函数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)
的最佳方法是什么?
答案 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)=0
和f(x)<1e-10
之间的任何差异。