My if x ~= y statement is not working

조회 수: 3 (최근 30일)
Nils Norlander
Nils Norlander 2017년 3월 2일
댓글: dpb 2017년 3월 2일
Dear all,
I have a really simple annoying problem which I can't wrap my head around.
In my code:
for k = time
if E_load2(k) ~= Allowed_winter
disp(k)
overload = overload+1;
else
overload = overload+0;
end
end
I can see that the if loop returns the logical true even though I know that E_load2(k) == to Allowed_winter at that the certain k, and thus "overload" becomes larger than it should.
Allowed_winter = -0.5 if that helps.
Please help!

채택된 답변

dpb
dpb 2017년 3월 2일
== is precisely that to the LSB; undoubtedly the values in E_load2 in question are close but not identically equal. See the <FAQ> for the "why" in some detail.
For the k in question try
delt=E_load2-Allowed_winter
and observe the result; you'll find it will be something very small but not zero.
Use a tolerance on the comparison or later releases have the function ismembertol that makes writing the expression a little easier.
overload=sum(~ismembertol(E_load2,Allowed_winter));
should do the trick (note no loop needed here).
  댓글 수: 6
Nils Norlander
Nils Norlander 2017년 3월 2일
Sorry, I'm pretty new to this community as I learned Matlab for my masters thesis.
dpb
dpb 2017년 3월 2일
No problem; just wondered about the inconsistency if ismembertol did work out (as I figured it would)...

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Adam
Adam 2017년 3월 2일
편집: Adam 2017년 3월 2일
Never compare floating point numbers with == or ~=
Floats are not 100% accurate so you will run into these kinds of confusions. If you get a value that is 0.50000000000001 then it will return false even though it may have been the result of a floating point rounding error.
  댓글 수: 1
Nils Norlander
Nils Norlander 2017년 3월 2일
Thank you so much! You've saved me a lot of head ache.

댓글을 달려면 로그인하십시오.


John D'Errico
John D'Errico 2017년 3월 2일
Why are you bothering with this line?
overload = overload+0;
The last time I checked, adding zero to something does nothing but waste CPU cycles. I sincerely doubt that your goal is code that runs more slowly than necessary.
Anyway, it is high time to learn how to use MATLAB.
overload = sum(E_Load2 ~= Allowed_winter);
No loop required.
Or, if time is just the indices of a subset of the elements of E_load2, then use
overload = sum(E_Load2(time) ~= Allowed_winter);
Finally, your problem with the test. This is likely due to the fact that E_load2 or Allowed_winter is not exactly -0.5 in some cases.
  댓글 수: 1
Nils Norlander
Nils Norlander 2017년 3월 2일
Thank you for your input! I knew the overload = overload+0; was unnecessary, and was simply there in a desperate way to bugtest

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Get Started with MuPAD에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by