双范围0 -1如何获得最佳精度?

时间:2015-02-06 14:37:11

标签: c# precision floating

我的问题是以下

我必须使用[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之间的数字)

但是在其他一些方面(比如在人工神经网络中使用权重衰减方法设置权重,其中权重尽可能小)或者在使用梯度下降方法的通用框架中...

所以至少只是为了个人的好奇心,我想知道是否有更好的方法来执行这种计算。

感谢All,我很抱歉以不清楚的方式在这个问题之前写过,我希望现在会更清楚。

1 个答案:

答案 0 :(得分:0)

您的值的按比例缩放不应对您的准确性产生重大影响。

您可以将浮点数或双精度值视为使用固定有效位数写入的数字,只能用二进制而非基数10来完成。就像(相对)精度没有区别一样无论你是写1.234(= 1.234e0)还是12340(= 1.234e4),无论你是缩放浮点值还是加倍值,它对相对精度也没有影响。

换句话说,使用0-1的范围是完全正常的,你不必担心你会失去&#34;通过不使用大于1的大量数字的相对准确性。只要你的数字真的不接近0(如同使用双倍时的1e-300),你就不会获得通过线性扩大它们的任何准确度。