Comparision double values 135 with 135.0000

1 ビュー (過去 30 日間)
Simon
Simon 2021 年 11 月 30 日
編集済み: John D'Errico 2021 年 11 月 30 日
In my Matlab-Script there are two large vectors, I want to compare with each other at several indexes in a for loop. In one vector the value 135 is stored as the double-value "135" with a size of 8 Bytes. The other vector stores the same value, with the same size as "135.0000". A comparision with a simple if-statement and the == operator does not succeed.
What I did:
  • using class() to verify the datatyp. Both are double
  • parsing the two values to an integer with int64(). That doesnt make sense in my code
  • using double() to force the same datatype. As documented by Mathworks, that has no effect: If X is already a double precision array, double has no effect.
How do I compare these two double-values?
What is the differnece between these two values, if they are both of the same datatype and the same size?

採用された回答

Stephen23
Stephen23 2021 年 11 月 30 日
編集済み: Stephen23 2021 年 11 月 30 日
" A comparision with a simple if-statement and the == operator does not succeed."
Yes, it does succeed: their values are different, and so EQ correctly returns FALSE.
This is very easy to demonstrate:
X = pi
X = 3.1416
Y = pi+eps(pi)
Y = 3.1416
X==Y % EQ operator "succeeds", because the values are NOT the same.
ans = logical
0
"How do I compare these two double-values?"
Using EQ compares the values for exact equivalence, which is not robust if you are working with binary floating point numbers. In that case the robust appraoch is to compare the absolute difference against a tolerance:
tol = 1e-5;
abs(X-Y)<tol % how to compare binary floating point numbers
ans = logical
1
"What is the differnece between these two values, if they are both of the same datatype and the same size?"
Their values.
  2 件のコメント
Simon
Simon 2021 年 11 月 30 日
Thanks a lot for that detailed information. It really helped me to learn more about Matlab and how it communicates. Now I understand my problem.

サインインしてコメントする。

その他の回答 (1 件)

Awais Saeed
Awais Saeed 2021 年 11 月 30 日
I had this issue once. I am just suggesting what helped me. It is possible that the actual value is not 135.0000. If 135.0000 is not comming out to be equal to 135, then it means that it is not equal after some decimal points.
The default format for display in matlab is format short. Use format long to see the difference. Here is an example below:
format short
d1 = 135;
d2 = 135.0000000000001 % note what the result is. It just showed you the clipped version
d2 = 135.0000
isequal(d1,d2) % logic 0 would mean that two values are not equal
ans = logical
0
% Now use format long (this will show you the actual number)
format long
d2
d2 =
1.350000000000001e+02
What I did is to keep just 4 digits after the decimal, remove the rest, and then compare.
  2 件のコメント
John D'Errico
John D'Errico 2021 年 11 月 30 日
編集済み: John D'Errico 2021 年 11 月 30 日
It is not that 135.0000 is POSSIBLY not 135. It is very likely not 135. Those extra zeros are a clue that you should recognize.
x = 135 + 1e-12
x = 135.0000
y = 135
y = 135
x == y
ans = logical
0
Do you see the difference? x and y are not equal, even though they look the same. But those spare zeros are a big clue. If x and y are combined in an array, then you can see spare zeros on x too though.
[x,y]
ans = 1×2
135.0000 135.0000
When I created a vector combining the two numbers and one of them is not an integer, MATLAB decides to display both numbers using the same format. So there are some cases when spare zeros are not of any significance.
Finally, will format long ALWAYS show you the complete, actual number? Well, still not true.
z = 1 + eps
z = 1.0000
format long
z
z =
1.000000000000000
Is z identically 1? No. But still, even format long fails to show that tiny variation in the least significant bit of z. The spare zeros shown are again a suggestion that z was not truly 1.
z == 1
ans = logical
0

サインインしてコメントする。

タグ

製品


リリース

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by