emb*_*ert 3 matlab loops octave
在这个回答 gire中提到,==在比较双打时最好不要使用.
for使用start:step:stop表示法在循环中创建增量变量时,它的类型将为double.如果想要使用此循环变量进行索引和==比较,可能会因浮点精度导致问题?!
应该使用整数吗?如果是这样,是否有办法用s:s:s符号表达?
这是一个例子
a = rand(1, 5);
for ii = length(a):-1:1
if (ii == 1) % Comparing var of type double with ==
b = 0;
else
b = a(ii); % Using double for indexing
end
... % Code
end
Run Code Online (Sandbox Code Playgroud)
请注意,浮点双精度指定使用52位来存储尾数(小数点后面的部分),因此您可以精确地表示范围内的任何整数
-4503599627370496 <= x <= 4503599627370496
Run Code Online (Sandbox Code Playgroud)
请注意,这大于int32的范围,int32只能表示
-2147483648 <= x <= 2147483647
Run Code Online (Sandbox Code Playgroud)
如果你只是使用double作为循环变量,并且只以整数步长递增,并且你没有计算超过4,503,599,627,370,496那么你可以使用double,并==用来比较双精度.
人们建议不使用双打的一个原因是你不能准确地表示一些常见的小数,例如0.1没有精确表示为双精度.因此,如果您正在使用货币值,最好将数据单独存储为int并记住10x或100x或其他任何比例因子.
直接比较浮点数是否相等有时是不好的,因为舍入问题可能导致两个浮点数不相等,即使数字在数学上是相等的.这通常发生在数字不能精确表示为浮点数时,或者当数字之间存在显着的大小差异时,例如
>> 0.3 - 0.2 == 0.1
ans =
0
Run Code Online (Sandbox Code Playgroud)