Understanding Precision in Matlab
3 ビュー (過去 30 日間)
古いコメントを表示
I have a simple question. How to split the different between the two numbers into 1e6 increment (unisg linspace)?
The numbers: 5.047639467288342e+4 and 5.047639467288343e+4.
Thanks
2 件のコメント
Stephen23
2020 年 7 月 1 日
"How to split the different between the two numbers into 1e6 increment (unisg linspace)?"
You can't. There are no binary floating point numbers inbetween the two values that you gave.
We can confirm this very easily by noting that their hex representations differ only by 1:
>> A = 5.047639467288342e+4;
>> B = 5.047639467288343e+4;
>> num2hex(A)
ans = 40e8a58ca12906dd
>> num2hex(B)
ans = 40e8a58ca12906de
回答 (1 件)
Walter Roberson
2020 年 7 月 1 日
You cannot do that with double precision.
If you have the symbolic toolbox then:
r = linspace(sym('5.047639467288342e+4'), sym('5.047639467288343e+4'), 1e6+1);
Note that the results will be symbolic numbers with higher precision than double(), so if you were to double() them, it would be with loss of precision
2 件のコメント
Walter Roberson
2020 年 7 月 1 日
Determinants can have a lot of problems with cancellation. If you were to use symbolic numbers it would be better to use
r = linspace(sym(5.047639467288342e+4,'f'), sym(5.047639467288343e+4,'f'), 1e6+1);
However, symbolic determinants are slow. To put 1e6 numbers into an array you would need an array at least 1e3 x 1e3, and a proper accurate determinent of that would involve over 4 * 10^2567 terms.
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
製品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!