出于某种原因,如果我1.0 - Double.leastNonzeroMagnitude
,则返回1.0
。
第一个问题,为什么?
其次,如何获得大于零的最小Double
,并且在我做数学时实际工作?
Ps。:我正在寻找这个的原因是为了避免在将sigmoid
导数与交叉熵损失导数相乘时得到的一些NaN。
A) sigmoid: 1 / (1 + exp(-z))
B) sigmoid derivative: sigmoid * (1 - sigmoid) // s * (1 - s)
C) cross entropy loss derivative: -y / s + (1 - y) / (1 - s)
B * C = s - y
乘以B
和C
应该给我一个实际数字,但我计算B
,然后计算C
,然后将两者相乘,即在某些情况下给我NaN(因为在B
上除以零)。
Ps.2:我知道拥有epsilon = 1e-16
并简单地将其添加到我的功能中,但我正在寻找一些东西"更正确"如果你知道我是什么的意思。
修改
解释为什么这个问题与所提到的问题不重复,在这个问题上我要求解决一个" epsilon"数字,而不是为什么浮点数学被打破。我不太关心低级细节,我只想要一个在未来可靠的解决方案。