matlab的精度变量,MatLab - 变量精度算术
永遠不要假設像vpa(sin(pi / 4))這樣的數(shù)字精確到完全精度,因為MATLAB通常會使用浮點運算來計算vpa調用內的數(shù)字,因此只能精確到大約16位數(shù)。
但是,它似乎在這里是正確的。例如,我們知道這一點
sin(pi/4) == sqrt(2)/2讓我們測試一下結果。我將使用100位數(shù)的精度,比較vpa和我自己的HPF工具。
>> vpa(sin(pi/4),100)
ans =
0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864
>> vpa(sqrt(sym(2))/2,100)
ans =
0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864
>> sqrt(hpf(2,100))/2
ans =
0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864
>> sin(hpf('pi',100)/4)
ans =
0.7071067811865475244008443621048490392848359376884740365883398689953662392310535194251937671638207864因此,我的猜測是解析器已將輸入識別為符號工具箱可以更準確地計算的內容。正如我之前所說,但要小心。什么是罪(pi / 12)?
>> vpa(sin(pi/12),100)
ans =
0.25881904510252073947640383266843855381011962890625
>> vpa('sin(pi/12)',100)
ans =
0.2588190451025207623488988376240483283490689013199305138140032073150569747488019969223679746942496655
>> vpa(sin(sym('pi')/12),100)
ans =
0.2588190451025207623488988376240483283490689013199305138140032073150569747488019969223679746942496655
>> sin(hpf('pi',100)/12)
ans =
0.2588190451025207623488988376240483283490689013199305138140032073150569747488019969223679746942496655在第一種情況下,解析器沒有保存我們。在其他人中,我強迫MATLAB計算正確的值。事實上,一些努力會給我們sin(pi / 12)的價值,如sqrt(2)*(sqrt(3) - 1)/ 4。
>> DefaultNumberOfDigits 100
>> (sqrt(hpf(3)) - 1)*sqrt(hpf(2))/4
ans =
0.2588190451025207623488988376240483283490689013199305138140032073150569747488019969223679746942496655關鍵是,不要相信解析器在這里保存你。
編輯:作為Amro評論的測試,我恭敬地說MATLAB在這里做了一些有趣的事情??吹絭pa能夠返回pi的正確的前100位數(shù),即使作為雙精度數(shù)傳遞pi也是如此。因為pi(作為一個雙精度數(shù))在第16個十進制數(shù)字之后是不正確的,所以有一些可疑的事情發(fā)生了。
>> vpa(pi,100)
ans =
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
>> vpa('pi',100)
ans =
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
vpa('pi',100) - vpa(pi,100)
ans =
0.0作為對這一事實的測試,讓我們看看HPF發(fā)現(xiàn)了什么。 HPF實際上采用IEEE 754值,如存儲在double中,然后將其轉換為HPF編號。
>> hpf(pi,100)
ans =
3.141592653589793115997963468544185161590576171875
>> hpf('pi',100)
ans =
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
>> hpf('pi',100) - hpf(pi,100)
ans =
0.0000000000000001224646799147353177226065932275001058209749445923078164062862089986280348253421170679821480800000000很明顯,MATLAB能夠將pi識別為不僅僅是傳遞的雙精度值。
EDIT2:
事實上,一些戲劇告訴我這里發(fā)生了什么。 VPA是棘手的,而不是解析器??紤]7/13分數(shù)。如果我們將它構建為double,那么打印出存儲在其完整榮耀中的浮點值,我們認為它并不是真正準確的。這是預期的。
>> sprintf('%.100f',7/13)
ans =
0.53846153846153843591793020095792599022388458251953125000000000000000000000000000000000000000000000007/13是重復的十進制值。這是正確的數(shù)字:
>> vpa('7/13',100)
ans =
0.5384615384615384615384615384615384615384615384615384615384615384615384615384615384615384615384615385現(xiàn)在,假設我們嘗試創(chuàng)建相同的數(shù)字。在這里我將以7/13的速度傳遞asa double,但我會在底部的十進制數(shù)字中出錯
>> sprintf('%.100f',0.538461538461538461777777777)
ans =
0.5384615384615384359179302009579259902238845825195312500000000000000000000000000000000000000000000000在這里,我們看到vpa捕獲并糾正了我所做的'錯誤',認識到我傳入的內容實際上與我在7/13中傳遞時的值相同。
>> vpa(0.538461538461538461777777777,100)
ans =
0.5384615384615384615384615384615384615384615384615384615384615384615384615384615384615384615384615385當然,如果我將值作為字符串傳遞,那么vpa就會出錯。
>> vpa('0.538461538461538461777777777',100)
ans =
0.538461538461538461777777777這解釋了為什么vpa能夠捕獲并正確計算vpa(sin(pi / 4),100),達到所要求的全部精度。 sin(pi / 4)被計算為double,但是vpa將其視為與sqrt(2)/ 2的雙精度版本相同的數(shù)字。
當然要小心。例如,vpa不夠智能,無法捕捉pi的這種簡單轉變。
>> vpa(pi + 1,100)
ans =
4.141592653589793115997963468544185161590576171875
>> vpa(pi,100)
ans =
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的matlab的精度变量,MatLab - 变量精度算术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: set和map去重调用什么方法_你真的了
- 下一篇: html缩进快捷键_Windows ID