Comparision double values 135 with 135.0000
23 次查看(过去 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?
0 个评论
采纳的回答
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
Y = pi+eps(pi)
X==Y % EQ operator "succeeds", because the values are NOT the same.
"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
"What is the differnece between these two values, if they are both of the same datatype and the same size?"
Their values.
2 个评论
Stephen23
2021-11-30
Tip if you are interested in learning about MATLAB:
In the default FORMAT a binary floating point number with zero decimal fraction is displayed without any decimal fraction digits. In contrast, as soon as any trailing decimal fraction digits are non-zero then MATLAB always displays the digits (up to the number specified by the FORMAT).
A = 135 % exactly 135
B = 135 + eps(200) % not 135
This tells us without even having to do any comparisons that your two values given in your title "Comparision double values 135 with 135.0000" are NOT the same. MATLAB really is trying to help you.
更多回答(1 个)
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
isequal(d1,d2) % logic 0 would mean that two values are not equal
% Now use format long (this will show you the actual number)
format long
d2
What I did is to keep just 4 digits after the decimal, remove the rest, and then compare.
2 个评论
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
y = 135
x == y
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]
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
format long
z
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
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!