Creating vectors from 0 to 1, i.e. 0:0.01:1 leads to invisible rounding errors?
14 ビュー (過去 30 日間)
古いコメントを表示
Hi,
I came across the following problem while trying to merge two tables with innerjoin:
Whenever I create vectors counting up from 0 to 1 tiny rounding errors seem to creep in, which one can only notice when scaling the vector up i.e. looking at (0:0.01:1)'*100.
Is there a chance I might have screwed up my Matlab settings at some point?
1 件のコメント
Stephen23
2018 年 3 月 3 日
This topic comes up very often:
etc, etc, etc
Always use a tolerance when comparing floating point values.
採用された回答
Ahmet Cecen
2018 年 3 月 3 日
Check "eps". Those are numerical artifacts introduced because you are accessing decimal points beyond the accuracy of MATLAB(double precision). Double is guaranteed to be accurate up to 15 significant digits (I think). The errors you see are the 16th or 17th significant digit of the original double you created i.e. 0.01.
This shouldn't effect your computation unless you do multiplication/division at very high orders of magnitude difference.
2 件のコメント
John D'Errico
2018 年 3 月 3 日
I would not say that double is guaranteed to be accurate to ANY number of decimal digits.
A double is stored in BINARY form. So the number is represented with a 52 bit binary mantissa, then displayed in decimal form (maybe because people tend not to be able to read binary numbers well.) So there is no guarantee of a certain number of digits. As it turns out, eps for a double
eps
ans =
2.2204e-16
So you get almost 16 decimal digits.
Ahmet Cecen
2018 年 3 月 3 日
編集済み: Ahmet Cecen
2018 年 3 月 3 日
Yeah, I simplified things a little bit. As a rule of thumb though it is fair to say 15 significant digits in base10 math is the most you can accommodate in double, depending on your operation (something simple enough); as 2^52 is 4.5*e+15.
その他の回答 (1 件)
Testdriver
2018 年 3 月 3 日
2 件のコメント
Ahmet Cecen
2018 年 3 月 3 日
編集済み: Ahmet Cecen
2018 年 3 月 3 日
Always round your numbers (to an appropriate significant digit) if you want to use them as indices or keys in a dataset, just good practice. Better yet, use int64 if at all possible.
Walter Roberson
2018 年 3 月 3 日
With the one exception that if the data is certain to be drawn from exactly the same source then it is fair to compare it for equality.
For example, although you should not compare a computed value to 0.01 exactly, it is fair to test x == max(x) because the max(x) will be a bitwise identical copy of some element of x.
参考
カテゴリ
Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!