2015-02-06 86 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