【问题标题】:How to have best precision with double in range 0 -1?如何在 0 -1 范围内获得最佳精度?
【发布时间】: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) 浮点数相加以获得最终结果,您可能需要先对它们进行排序,然后从最小的开始 - 这样可以最大限度地减少舍入误差。不确定是否可以为乘法给出类似的规则..

标签: c# precision floating


【解决方案1】:

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

您可以将浮点值或双精度值视为使用固定有效位数写入的数字,只是它是以二进制而不是基数 10 完成的。无论您写 1.234,这对(相对)准确性都没有影响(=1.234e0) 或 12340 (=1.234e4),无论您缩放浮点值还是双精度值,它对相对精度也没有影响。

换句话说,使用 0-1 的范围是完全可以的,您不必担心不使用大于 1 的大量数字会“失去”相对准确性。只要您的数字不会真正接近 0(例如,使用双精度数时为 1e-300),通过线性缩放它们不会获得任何准确性。

【讨论】:

  • 你错了。浮点的形式为 a^b (两者都有符号) ,这导致范围 [Double.Max, 1] U [-1, Double.Min] 具有与 [1, -1] 相同数量的 descrite 值/跨度>
  • 实际上是a*2^b,而不是a^b。没错,您提到的范围具有大致相同数量的值。我看不出这与我的回答有何矛盾。
  • 双精度可以表示“正常”双精度范围内的任何值(大约 10^-307 到 10^308),相对误差小于 0.000000000000012%。具有高尾数的值具有大约两倍的分辨率,但使用范围 [0,1] 已经充分利用了这一事实。
猜你喜欢
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2021-08-26
  • 2018-02-22
  • 2021-05-05
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多