【发布时间】:2015-02-06 14:37:10
【问题描述】:
我的问题如下
我必须对 [0,1] 范围内的数字执行操作。 现在假设我处于以下情况:
double[] a = new double[100]();
// initialize a with random numbers
double b = 1;
for(int i=0; i<100;i++){
b *= a[i];
}
最好做类似的事情:
double[] a = new double[100];
// initialize a with random numbers
double[] A = new double[100];
for(int i=1;i<N;<i++){
A[i] = log(a[i]);
}
double b =0;
for(int =0;i<100;i++){
b += A[i];
}
b = exp(b);
第二个建议是愚蠢的东西,只是为了突出问题。有一种“正确的方法”来乘以总是从 0 到 1 的值吗? 正如 Medo42 指出的那样,我认为 double 给出的精度足以以正常方式工作,至少在我的应用程序中(即使我不确定,因为在 Q-Learning 中 - 例如 - 我们使用做一些类似于 S = X1 * Alpha + X2 * Alpha^2 + X3 * Alpha^3 + x4 * Alpha^4 ... 其中 Alpha 是介于 0 和 1 之间的数字)
但在其他一些情况下(例如在具有权重衰减方法的 ANN 中设置权重,其中权重会尽可能小)或在使用梯度下降方法的通用框架中...
所以至少出于个人好奇心,我想知道是否有更好的方法来执行这种计算。
感谢所有人,我很抱歉在这个问题之前写得不清楚,我希望现在会更清楚。
【问题讨论】:
-
为了精确,请使用
decimal。 -
很难理解您的实际要求。您能否尝试更新您的问题并说明清楚,也许添加一个示例或一些代码?
-
我同意 ChrFin。我不知道这篇文章是关于数值精度还是一种在任何范围内向外表示某个数字的方法,尽管它可以在内部标准化为 0-1 的范围。
-
我可以提供的一个建议是,如果您需要将许多 (many) 浮点数相加以获得最终结果,您可能需要先对它们进行排序,然后从最小的开始 - 这样可以最大限度地减少舍入误差。不确定是否可以为乘法给出类似的规则..