[英]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中進行任意精確的算術運算,請考慮使用BigInteger
和BigDecimal
。
問題是當你得到越來越高的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.