主题:Fortran log运算
heckzhang
[专家分:0] 发布于 2012-08-27 11:42:00
大家好,我现在正用Fortan做一个运算,其中要用到这样一个式子,y=log{1 /( 1+exp(x) )}.
exp(x)中的 x 一旦大于709 的话,exp(x) 的值就会大于Fortran 可以运算的范围。理论上
1 /( 1+exp(x) ) 会非常小,Fortran会默认为 0 。 如果这样的话,log(0)是没法运算的,请问该
如何处理呢?
回复列表 (共5个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2012-08-27 11:59:00
当 x 很大的时候,exp(x) 更大更大,所以 1+exp(x) 几乎就 == exp(x)
所以 y = log(1/(1+exp(x))) 约等于
y = - log( exp(x) )
= -x * log(e)
其中 e = 2.718281828 ,我怀疑你的 log 应该是 ln
那样的话 , y = -x
板凳
yeg001 [专家分:14390] 发布于 2012-08-27 12:00:00
我讲讲我的看法吧.
y=log{1/(1+exp(x))} = -log{1+exp(x)}
单精度计算的话, 有效数字6~7位左右, 所以1+exp(x)如果值大于10^7, 这个1就被误差吃掉(此时x=16~18左右). 于是可以合理地近似为:1+exp(x)=exp(x). 原式 y= = -log{exp(x)} = -x
双精度相应条件做出点变化.
个人看法, 仅供参考.
3 楼
yeg001 [专家分:14390] 发布于 2012-08-27 12:01:00
差一分钟, 在雪球兄面前献丑了...
4 楼
heckzhang [专家分:0] 发布于 2012-08-27 12:05:00
非常感谢您的回复!
5 楼
臭石头雪球 [专家分:23030] 发布于 2012-08-27 12:06:00
[quote]差一分钟, 在雪球兄面前献丑了...[/quote]
词异理相同,与君共勉
我来回复