2015-02-06 84 views
-2

我的问题是以下内容如何在范围0 -1中获得双精度的最佳精度?

我必须使用范围[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中设置权重)或在使用梯度下降方法的通用框架中...

因此,至少只适用于个人好奇心我想知道是否有更好的方法来执行这种计算。

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

+2

为了精度,使用'decimal'。 – 2015-02-06 14:38:52

+5

它很难理解你实际要问什么。你可以尝试更新你的问题,并说清楚,也许增加一个例子或一些代码? – ChrFin 2015-02-06 14:41:00

+2

我同意ChrFin。我不知道这篇文章是关于数值精度还是一种在任何范围内向外表示某个数字的方法,尽管它可以在内部归一化到0-1的范围。 – 2015-02-06 14:42:45

回答

0

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

您可以将浮点数或双精度值看作是使用固定数量的有效数字编写的数字,只是它用二进制而不是基数10来完成。就像您写的(相对)精度无关1.234(= 1.234e0)或12340(= 1.234e4),无论缩放浮点数还是双精度值,相对精度也不会有差别。

换句话说,使用0-1的范围是非常好的,你不需要担心没有使用大于1的广泛数字而“失去”相对准确性。只要你的数字不会真的接近0(如使用双精度时的1e-300),你不会通过将它们线性缩放得更大来获得任何精度。

+0

你错了。浮点的形式为a^b(均为带符号),其结果范围[Double.Max,1] U [-1,Double.Min]具有与[1,-1]相同的descrite值数量 – 2015-02-07 16:52:10

+0

它实际上是'a * 2^b',而不是'a^b'。你说得对,你提到的范围大致具有相同数量的值。我看不出与我的答案矛盾。 – Medo42 2015-02-09 00:17:08

+0

double可以表示“正常”双倍范围(粗糙10^-307至10^308)中的任何值,相对误差小于0.000000000000012%。尾数高的值大约是分辨率的两倍,但使用范围[0,1]已经充分利用了这一事实。 – Medo42 2015-02-09 00:36:17