gpt4 book ai didi

MATLAB ismember() 问题

转载 作者:行者123 更新时间:2023-12-05 01:22:27 32 4
gpt4 key购买 nike

以下命令返回 1:

ismember(-0.6, -1:.1:.9)

但下一个命令返回 0:

ismember(-0.1, -1:.1:.9)

即使 -0.1 显然在 -1:.1:.9 中。

有人知道这是怎么回事吗?

最佳答案

问题是,当您从 -1.0 开始并重复添加 0.1 时,您得到的数字与直接指定 -0.1 时的数字略有不同。这是因为浮点错误累积。就像 1/3 不能精确地用十进制表示(变成 0.33333...)一样,很多十进制数也不能用二进制精确表示。 0.1 转换为二进制时实际上非常接近 0.1。因为当你用这个 float 做运算时会出现一个小错误,这个小差异会累积并变得越来越大。

来自 http://www.mathworks.com/matlabcentral/newsreader/view_thread/246492 :

Ashwini Deshpande wrote:


I have a matrix as follows,

a = 0:0.1:1;

when I tried to find whether 0.300 is present in the matrix a, using the following procedure,

>> [tf, loc]=ismember(0.3,a)

I got the following result:

tf =
0
loc =
0

But it's suppose to give me, tf = 1 and loc =4.


实际上,您得到的是正确的结果。看看会发生什么:

     v=0:.1:1;
n=0.3;
sprintf('%30.20f\n',v(4),n)
%{
0.30000000000000004000 % <- result from vec
0.29999999999999999000 % <- result from handwritten number
%}
format hex;
[v(4),n,v(4)-n].'
%{
3fd3333333333334 % <- vec
3fd3333333333333 % <- num
3c90000000000000 % <- diff
%}
format;

另外,细读 http://matlabwiki.mathworks.com/MATLAB_FAQ#Why_is_0.3-0.2-0.1_not_equal_to_zero_.28or_similar.29.3F

关于MATLAB ismember() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1202915/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com