在我的代码中,我有时会得到除零。调试器始终指向包含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 //
知道我做错了吗?
答案 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))
当然可能是罪魁祸首,但那只是抓住稻草。