我试图在单精度变量上做sub2ind,我遇到了以下奇怪的行为.例如,当我尝试:
[a b] = ind2sub([50000 50000], sub2ind([50000 50000], single(1000), single(1000)))
Run Code Online (Sandbox Code Playgroud)
我明白了:
a = 1001
b = 1000
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我遗失了什么?我知道这可能是因为matlab代码中某处出现溢出但不应该发生,对吧?
我从64位(glnxa64)R2012a,R2011a,R2010b,R2010a得到了相同的错误行为,但是从32位(glnx86)R2010b得到了正确的结果.
发生这种情况的原因如下.
在ind2sub.m的第35行是
vi = rem(ndx-1, k(i)) + 1;
Run Code Online (Sandbox Code Playgroud)
其中ndx是传入的索引.因此,通过sub2ind的调用,ndx为49951000.现在,当您传入单个精度值时,它会强制matlab以单精度计算所有数学运算.因此,比较在l.35上发生的事情的差异.
K>> 49951000-1
ans =
49950999
K>> single(49951000)-1
ans =
49951000
Run Code Online (Sandbox Code Playgroud)
从大数字中减去一小部分是个问题.所以不,这不是一个错误,它是对单精度浮点精度的限制.这可能会有所帮助.
编辑:正如拉斯曼所指出的,展示这一点的好方法是使用eps
eps(single(49951000))=4
Run Code Online (Sandbox Code Playgroud)
因此,在范围(-4,4)上的单个(49951000)中添加或减去的任何值将导致由于单精度的准确性而返回495100.