2014-03-07 173 views
1

我已經做了一個問題,寫一個方法來輸入一個類型爲LONG的數組,存儲所有2的冪從0到63的值(即2 to 2 )在Java中使用Math.pow計數獲得精度錯誤

輸出陣列屏幕的角度。 提示:Math.pow(X,Y)是UED把數X的指數y

到目前爲止,我有這樣的事情

我不斷收到錯誤或Math.pow(大小,2);需要很長時間,發現一倍。 我試過Math.pow(i,2);我得到的精度相同error./可能損失,,任何幫助:)謝謝

class ws3q2 
{ 
    public static void main(String[]args) 
    { 

     int ARRAY_SIZE = 5; 

     long size = ARRAY_SIZE; 

     long[] array = new long[ARRAY_SIZE]; 

     for(int i = 0; i < ARRAY_SIZE; ++i) 
     { 
     array[i] = Math.pow(size,2); 
     } 

    } 
} 
+1

請複製並粘貼* exact *錯誤信息,以便我們能夠爲您提供幫助。 –

+0

只需編寫'size * size'即可。 – Joey

+0

嗯我想我可能有代碼錯誤,我有另一種代碼嘗試它的另一種方式,因爲如果你讀的問題,它假設平方,但與我把int array_size = 5; 嗯即時通訊只是新的在這裏我不能回答我自己的問題,所以我不能發佈我的不同的代碼我試過./ – user3392994

回答

2

更好的換擋

對於2 X其中 X∈ℕ,你最好寫這作爲比特移位

1L << x 

,而不是一個浮點冪

pow(2, x) 

無論是在精度和性能方面。實際上,1L << x非常容易計算,所以我寧願寫這個而不是array[x],所以你可能完全避免這個數組。

更多錯誤?

pow(x, 2),你在你的代碼編寫會 X ,你可以計算更容易地x*x。那麼,究竟哪一個是兩個或兩個方格的權力呢?

此外,你寫pow(size,2)它使用size而不依賴於i。所以你的數組的所有值都是相等的。我想這不是你的意思。

當你的錯誤來自

錯誤消息的原因是事實,Math.pow結果是雙,並且從doublelong隱式轉換在Java中是被禁止的。您必須寫明確的演員,即(long)pow(2, x)。但是,這確實趨向於零,因此輕微的數字錯誤可能會導致錯誤的結果。 Math.pow的唯一正確性保證是這樣的:

計算結果必須在精確結果的1 ulp以內。

你可以做轉換之前加0.5,或使用Math.round而不是演員,但你看,你要知道很多約浮點運算得到這個正確的內部工作。更好地堅持整數數學,並且完全避免doubleMath.pow

+0

恩對不起還是很新的java,剛剛開始大學第一年..你能解釋一下更多的地方,在我的代碼中的所有地方,謝謝真的很有幫助 – user3392994

+1

@ user3392994:不,對不起,我不會寫你的代碼給你。嘗試一下你自己的方法,或許可以嘗試一下,也可以稍微搜索一下網絡,即使它需要更長的時間,你也會在這個過程中學到東西。關於Java的東西,但也有關於如何找到信息的東西。 – MvG

+0

感謝關於錯誤的部分來自,幫助了我很多。現在我得到了更多,我認爲我已經修復了,從0到63的平方根,因爲Math.pow是雙倍的。並轉換爲長,謝謝 – user3392994

0

錯誤的原因是,Math.pow返回double,你想要一個long

但是你的數組的整點不清楚。當你寫:

array[i] 

你可以和寫:

1L << i 

,並得到同樣的結果。

另外,你甚至會保存數組邊界檢查。

0

代替long[] array = new long[ARRAY_SIZE];,用double[] array = new double[ARRAY_SIZE];讓你的程序是這樣的:

class ws3q2 
{ 
    public static void main(String[]args) 
    { 
     int ARRAY_SIZE = 5; 
     long size = ARRAY_SIZE; 
     double[] array = new double[ARRAY_SIZE]; 
     for(int i = 0; i < ARRAY_SIZE; ++i) 
     { 
      array[i] = Math.pow(size,2); 
     } 
    } 
} 

編輯: 如果你想long,然後將其存儲在轉換它,array[i]=(long)Math.pow(size,2); 或 隱蔽它不久溫度。陣列。

+0

但他希望'長'! – Ingo

+0

完成,好嗎?第一個對我來說似乎更好... – Ved

+0

你有錯誤順序pow的參數。如果你想讀其他的答案,你會注意到調用Math.pow獲得2的整數次冪只是矯枉過正,就像使用核反應堆來孵化蛋。 – Ingo

0

好的。首先Math.pow()返回一個double。你的數組是long類型的。其次,你的pow參數的順序是錯誤的,第一個參數是基數,第二個參數是指數。最後,你的指數使用了錯誤的變量(大小始終相同)。最後要注意的是2^63太大,不能用雙精確表示。如果你想使用longs,你應該使用(邏輯)Shift Left運算符來代替,正如其他人所提到的那樣。

在這裏,我固定它給你:

class ws3q2 
{ 
    public static void main(String[]args) 
    { 
     int ARRAY_SIZE = 5; 
     long size = ARRAY_SIZE; 
     double[] array = new double[ARRAY_SIZE]; 
     for(int i = 0; i < ARRAY_SIZE; ++i) 
     { 
      array[i] = Math.pow(2, i); 
     } 
    } 
} 
+0

感謝有助於提高更多/只是我有它不應該有array_size = 5的問題;它不應該讓我設定它應該做的事。因爲它傾向於存儲2的權力,從0到63 只是你已經爲我固定的代碼./數組是雙倍我需要它長,所以它可以更高的平方。不只是高達24^2 – user3392994

+0

增加ARRAY_SIZE 63. –

+0

現在做到了:)謝謝你們幫助了很多。看到我不知道,math.pow是一個雙,你必須轉換,發現如何做到這一點與所有你們幫助謝謝 – user3392994

0

事業,爲實際的錯誤信息,損失的精度,是你想要的,在戰俘的說法,以東西長整型64bit轉換成只能代表53bit整數的雙精度。如果您想爲float分配一個double值,您會得到相同的消息。

可以通過對輸入使用int類型來避免這種情況。對於符合64位有符號整數的正方形,參數不能比有符號的32位長(多),對於2的冪,指數必須小於63.

或者對於使用cosa < (1<<26)

array[i] = (long)Math.pow((double)cosa,2);