logical less than thinks values are the same?

1 回表示 (過去 30 日間)
David Pesetsky
David Pesetsky 2018 年 3 月 31 日
コメント済み: Walter Roberson 2018 年 4 月 1 日
I have wracked my brain over this one. It must be a dumb mistake.
if scalarMin < 1.0
fprintf('*scalarMin %f.\n',scalarMin);
end
scalarMin is exactly 1.000000, but it insists on printing anyway. Just want an output when it's actually <1.
What could it be?
  4 件のコメント
John D'Errico
John D'Errico 2018 年 3 月 31 日
format long g
x = 1 - eps
x =
1
It sure looks like 1. But is it?
sprintf('%0.55f',x)
ans =
'0.9999999999999997779553950749686919152736663818359375000'
No, it is not 1. And MATLAB confirms that fact.
x < 1
ans =
logical
1
David Pesetsky
David Pesetsky 2018 年 3 月 31 日
num2hex gives
3fefffffffffffff
What's that?

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

回答 (1 件)

John D'Errico
John D'Errico 2018 年 3 月 31 日
編集済み: John D'Errico 2018 年 3 月 31 日
You don't seem to believe what we are telling you. Here is 1.
num2hex(1)
ans =
'3ff0000000000000'
That is 1. Creating something slightly smaller than 1? Try this:
num2hex(1-eps)
ans =
'3feffffffffffffe'
Just because a number displays at the command line as looking like 1, it need not be exactly 1.
  4 件のコメント
John D'Errico
John D'Errico 2018 年 4 月 1 日
編集済み: John D'Errico 2018 年 4 月 1 日
Just a teeny tiny, itsy bitsy amount less than 1. But not 1.
sprintf('%0.55f',hex2num('3fefffffffffffff'))
ans =
'0.9999999999999998889776975374843459576368331909179687500'
As much as it looks like 1,
format long g
hex2num('3fefffffffffffff')
ans =
1
What is the saying? Close is only good in horseshoes and hand grenades.
Walter Roberson
Walter Roberson 2018 年 4 月 1 日
Consider using ismembertol()

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

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

タグ


Translated by