首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab floor bug?

Matlab floor bug?
EN

Stack Overflow用户
提问于 2012-09-27 05:41:38
回答 3查看 999关注 0票数 2

我想我在Matlab中发现了一个bug。我唯一的解释是,matlab在内部使用显示的值以外的其他值进行计算:

代码语言:javascript
复制
K>> calc(1,11)

ans =

   4.000000000000000

K>> floor(ans)

ans =

     3

显示的代码是Matlab控制台的输出。calc(x,y)只是一个双精度数组。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-27 07:05:20

MATLAB使用标准的IEEE浮点格式来存储双精度数。

看看如果我们从4中减去少量,MATLAB仍然显示4作为结果。

代码语言:javascript
复制
>> format long g
>> 4 - eps(2)
ans =
                         4

事实上,MATLAB以二进制形式存储该数字。我们可以看到该数字的十进制版本为:

代码语言:javascript
复制
>> sprintf('%.55f',4-eps(2))
ans =
3.9999999999999995559107901499373838305473327636718750000

显然,MATLAB不应该显示整个乱七八糟的数字,但是通过将结果四舍五入到15位,我们得到4作为显示。

显然,calc(1,11)中的值是这样一个数字,它在内部表示为小于4,但在显示时却舍入为4,但它并不是4。

千万不要相信浮点运算结果中显示的最低有效位。

编辑:

你似乎认为MATLAB中的3.999999999999999应该小于4。从逻辑上讲,这是有道理的。但是,当您提供该数字时会发生什么呢?啊,是的,双精度浮点数的粒度比这更大。MATLAB不能将其表示为小于4的数字。它会在内部将该数字向上舍入到恰好4。

代码语言:javascript
复制
>> sprintf('%.55f',3.9999999999999999)
ans =
4.0000000000000000000000000000000000000000000000000000000
票数 8
EN

Stack Overflow用户

发布于 2012-09-27 06:49:23

你得到的是一个非常接近但小于4的值,即使使用format long,Matlab也必须舍入到第15位才能显示这个数字。试试这个:

代码语言:javascript
复制
format long
asd = 3.9999999999999997 %first not-9 @16th digit

将打印4.000000000000000。任何不知道基于可视化的asd的实际值的人都会猜测它至少是4,但是运行

代码语言:javascript
复制
asd >= 4

提供0,因此floor(asd)返回3

所以问题是Matlab如何舍入显示的输出,存储在变量中的真值小于4。

更新:

如果进一步使用数字,如18x9:

代码语言:javascript
复制
>> asd = 3.999999999999999999
asd = 
     4
>> asd == 4
ans =
     1

asd完全变成了4!(请注意,它不再显示4.000000000000000 ),但这是另一回事,不再是为了获得更漂亮的输出而对数字进行舍入,而是关于浮点算术是如何工作的……实数可以表示到一定的相对精度:在这种情况下,您给出的数字非常接近4,以至于它本身就变成了4。看看@gokcehan或here在评论中发布的Python链接。

票数 3
EN

Stack Overflow用户

发布于 2015-03-26 09:42:59

我不会重复这个问题,而是提供一个解决方案:使用single函数:

B = single(A)将矩阵A转换为单精度,返回B中的值。A可以是任何数值对象(如double)。如果A已经是单精度,则single无效。单精度数量比双精度数量需要更少的存储空间,但精度较低,范围较小。

这只是为了修复这个特定的问题,所以您可以这样做:

代码语言:javascript
复制
K>> calc(1,11)

ans =

   4.000000000000000

K>> floor(single(ans))

ans =

 4
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12610903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档