使用Ln或Exp函数时除以零

时间:2015-04-13 19:19:36

标签: delphi math delphi-xe5

在我的代码中,我有时会得到除零。调试器始终指向包含Ln或Exp函数的行。

使用Ln功能。正如您所看到的,本节中根本没有任何区分。 vsn代表非常小的数字,等于1.0e-100。

 if a3 [row] <= 0 then a := vsn else
 if a3 [row] >= 1 then a := 1 - vsn
                  else a := a3 [row];
 costTerm := costTerm -1 * y [row] * Ln (a) -
                  (1 - 1 * y [row]) * Ln (1 - a);

使用Exp函数:这里存在一个除法,但是没有看到它如何产生除零错误。

function TBack_Prop.g (value: double): double;
begin
   Result := 1 / (1 + exp (-value));
end; // g //

知道我做错了吗?

2 个答案:

答案 0 :(得分:6)

ln(0)将除数提高零。在你的代码中,你将0传递给ln函数。

var
  I: Double;
  vsn: Double;
begin
  I := 1.0;
  vsn := 1.0e-100;
  I := I - vsn;
  ln(1 - I);
end;

然后行I := I - vsn并没有真正做任何事情。 double只有15-16位有效数字,所以vsn的值不会修改I.然后你有ln(1-1)计算ln(0)

exp(x)不能小于0.所以我无法在TBack_Prop.g中解释除以0。我说这个异常发生在其他地方。

答案 1 :(得分:2)

没有代表发表评论,我必须以答案的方式发表评论。

当使用真实或双精度时,vsn的最小可行尺寸为1.0e-16。这照顾了@Sebastion回答的第一个问题。

第二个问题是否是

(1 + exp(-value))

给出0的结果,因此除以零。不可能发生 但是,一个错字

(1 - exp(-value)) or (1 - exp(value))

当然可能是罪魁祸首,但那只是抓住稻草。