簡體   English   中英

Java Math.pow的錯誤結果

[英]Wrong result by Java Math.pow

如果您嘗試運行以下代碼

public class Main {
   public static void main(String[] args) {
       long a = (long)Math.pow(13, 15);
       System.out.println(a + " " + a%13);
   }
}

你會得到“51185893014090752 8”

13 ^ 15的正確值是51185893014090757 ,即大於Math.pow返回的結果5 任何可能導致它的想法?

您已經超過了雙精度浮點值中可用的有效位數(~15到16)。 一旦你這樣做,你不能指望你的結果中最不重要的數字實際上是有意義/精確的。

如果您需要在Java中進行任意精確的算術運算,請考慮使用BigIntegerBigDecimal

問題是當你得到越來越高的double值時,連續值之間的差距會增加 - 一個double不能代表其范圍內的每個整數值,這就是這里出了問題。 它將最接近的 double值返回到確切的結果。

這不是精確度問題。 Math.pow方法執行結果的近似。 要獲得正確的結果,請使用以下代碼。

long b = 13;
for(int i = 0; i != 14; i ++) {
    b = b * 13;
}
System.out.println(b);

輸出是預期結果51185893014090757L。

更一般地,當指數是整數時,應避免使用Math.pow方法。 首先,結果是近似值,其次是計算成本更高。

Math.pow(以及Math類中的大多數其他方法)的實現基於網絡庫netlib作為“Freely Distributable Math Library”包(請參閱StrictMath javadoc )。 可以在e_pow.c上找到C中的實現。

double具有有限精度,其尾數為52位,大致等於15到16位小數。 因此,您嘗試計算的數字不能再精確地用雙精度表示。

正確答案是提供可用double表示的最接近的數字

你有沒有檢查是否是這種情況?

這是因為通過強制轉換為double來保持數字的限制,浮動你可能但它會有一些錯誤,你應該自己處理計算的數字,將它們保存在一個不是一個簡單的方法的數組中

但是在python編程語言中你可以得到任何長度的結果,它是如此強大!

成功的!!!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM