2017-02-23 20 views
1

由於浮點錯誤2 ^(log(63)/ log(2))不等於63.檢查63在Matlab中不等於2 ^(log(63)/ log(2))

format long; 
>> 2^(log(63)/log(2)) 

ans = 

    63.000000000000014 

而可惜的是我不能根據Matlab的文件上對數使用VPA:下面的結果

與精確符號值,雙精度值固有 包含舍入誤差。 當您在雙精度 輸入上調用vpa時,vpa無法恢復丟失的精度,即使它返回的數字多於雙精度值的 。但是,vpa可以識別和恢復p/q,p/q,(p/q)1/2,2q和10q形式的表達式的精度,其中p和q是中等大小的整數。

那麼我該如何解決這個問題?我有非常大的數字,如2^200,我得到非常大的錯誤。

編輯:我不是問爲什麼發生。我在問如何使這項工作100%準確,所以這不是重複的。

迄今爲止最好的解決辦法:由@Sardar_Usama建議按預期並不總是工作

可惜的是解決方案。檢查以下的結果:

>> sym(2^(log(2251799813685247)/log(2))) 

ans = 

2251799813685259 

在另一方面

>> 2^(log(vpa(2251799813685247))/log(vpa(2))) 

ans = 

2.2517998136852470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0*10^0*10^15 

更接近2251799813685247 = 2^51更多。它的誤差約爲9.491 * 10^-494,這是目前爲止最好的解決方案,但仍然存在一些錯誤。

+1

有什麼具體問題?一般來說,如何避免浮點不準確?或者,如果沒有不準確的情況下如何評估2 ^(log(k)/ log(2))? –

+0

它有什麼問題,它不完全是63?這只是一個'2 * eps(63)'的區別。一般來說,數值計算不應該依賴確切的數值。 – horchler

+0

@horcler當你使用大數字時,它會顯着提高。 – Kitiara

回答

4

如果您不能使用roundvpa,有處理這個較慢的方式,如果你有符號數學工具箱,通過creating symbolic numbers。即

a = sym(2^(log(63)/log(2))) 

這會給你sym63,你可以使用後轉換爲double

double(a) 

這是你會得到什麼:

>> format long 
>> a = sym(2^(log(63)/log(2))) 

a = 

63 

>> double(a) 

ans = 

    63 
+0

不幸的是,這並不總是按預期工作。看看這個'sym(2 ^(log(2251799813685247)/ log(2)))'='2251799813685259'。 (btw 2251799813685247是2^51)另一方面,'2 ^(log(vpa(2251799813685247))/ log(vpa(2)))'更接近'2251799813685247'。錯誤在'〜2左右。252 * 10^-192'這對我的計算沒有任何麻煩,但仍然存在一些錯誤。 – Kitiara

+0

@Kitiara只有兩種選擇:*符號算術*和*數值算術*(其中包括*變量精度*和*雙精度*)。有*是*沒有其他選擇。獲得100%的準確度並不總是可能的。閱讀本文:https://www.mathworks.com/help/symbolic/recognize-and-avoid-roundoff-errors.html –

+0

好的,謝謝。 – Kitiara