使用Ln或Exp函数时除以零

Arn*_*old 0 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);
Run Code Online (Sandbox Code Playgroud)

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

function TBack_Prop.g (value: double): double;
begin
   Result := 1 / (1 + exp (-value));
end; // g //
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

Seb*_*n Z 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;
Run Code Online (Sandbox Code Playgroud)

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

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