フィルターのクリア

If statement with many logical or.

1 回表示 (過去 30 日間)
sourabh mittal
sourabh mittal 2018 年 10 月 8 日
回答済み: John D'Errico 2018 年 10 月 8 日
This is my code. I have a1 = 0.4 and b1 =0.2 and 1-a1-b1 = 0.4. Middle condition of if statement is satisfied but still it doesn't work. please help.
% code
for a1 = 0.4 : 0.1 : 1
for b1 = 0.2 : 0.1 : 1
if (a1 == b1 && b1 > 1-a1-b1) || (1-a1-b1 == a1 && a1 > b1) || (1-a1-b1 == b1 && b1 > a1)
continue;
end
file_name = sprintf('file_%.2f_%.2f_%.2f.txt',a1,b1,1-a1-b1);
fileID = fopen(file_name, 'w+');
fclose(fileID);
end
end
  9 件のコメント
Adam
Adam 2018 年 10 月 8 日
Yes, looking at the loop again, this could well cause a problem.
sourabh mittal
sourabh mittal 2018 年 10 月 8 日
% code
for a1 = 0.4 : 0.1 : 1
for b1 = 0.2 : 0.1 : 1
if (1-a1-b1 == a1 && a1 > b1)
continue;
end
file_name = sprintf('file_%.2f_%.2f_%.2f.txt',a1,b1,1-a1-b1);
fileID = fopen(file_name, 'w+');
fclose(fileID);
end
end
See this condition of if statement. this is not working as i described above.

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

採用された回答

Dennis
Dennis 2018 年 10 月 8 日
You are comparing floating point numbers, which will not necessary work:
1-0.4-0.2==0.4
ans =
0
You can use
abs(1-a1-b1-a1)<0.001
For more information please look here.

その他の回答 (2 件)

John D'Errico
John D'Errico 2018 年 10 月 8 日
Your problem is EXACTLY in that you are trying to compare floating point numbers, for exact equality. This is something you should never do, unless you completely understand floating point numbers, and how to know when you can do it safely. And even then you still need to take extra care.
But tests like this:
b1 > 1-a1-b1
are just a flat out bad idea. NEVER DO THAT. NEVER. Must I say it again? Don't do it. Period. For example, just how does 0.4 compare to 1-0.2-0.4? Surely they are the same number?
sprintf('%0.55f',0.4)
ans =
'0.4000000000000000222044604925031308084726333618164062500'
sprintf('%0.55f',1 - 0.4 - 0.2)
ans =
'0.3999999999999999666933092612453037872910499572753906250'
Not so.
Instead, you do have options.
for a1i = 4 : 10
a1 = a1i/10;
for b1i = 2 : 10
b1 = b1i/10;
if (a1i == b1i && b1i > 10-a1i-b1i) || (10-a1i-b1i == a1i && a1i > b1i) || (10-a1i-b1i == b1i && b1i > a1i)
yada yada yada...
As you should see, I changed all of your numbers to be integers, double precision integers, but still integers. All of the tests (assuming I did not mistype anything in that last line) work on INTEGERS, thus are comparisons between integers.
Compute a1 and b1 separately. Use them in floating point form, but NEVER use them for comparisons. NEVER. Well, again, unless you seriously know what you are doing, and you know why you should never use tests of that form.

ANKUR KUMAR
ANKUR KUMAR 2018 年 10 月 8 日
Write statement inside of the loop
for a1 = 0.4 : 0.1 : 1
for b1 = 0.2 : 0.1 : 1
if (a1 == b1 && b1 > 1-a1-b1) || (1-a1-b1 == a1 && a1 > b1) || (1-a1-b1 == b1 && b1 > a1)
file_name = sprintf('file_%.2f_%.2f_%.2f.txt',a1,b1,1-a1-b1);
fileID = fopen(file_name, 'w+');
fclose(fileID);
end
end
end

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by