为什么流(% 3.1 f,圆(eps))打印-0.0 ?

7视图(30天)
桑德尔托斯
桑德尔托斯 2017年1月17日
评论道: 詹姆斯Tursa 2017年1月17日
我发现了一些非常奇怪的行为在Matlab函数R2016b(至少对我来说)。我希望这对eps圆函数返回0,但令人惊讶的是命令:
num2hex(圆(eps))
返回:
8000000000000000
而不是
num2hex (0) = = 0000000000000000
这导致流()打印-0.0。这是一个错误还是我错过什么吗?
1评论
詹姆斯Tursa
詹姆斯Tursa 2017年1月17日
注:这似乎是一致的在相关功能装天花板和修复。例如,
> > num2hex(圆(eps))
ans =
8000000000000000
> > num2hex(装天花板(eps))
ans =
8000000000000000
> > num2hex(修复(eps))
ans =
8000000000000000

登录置评。

接受的答案

Stephen23
Stephen23 2017年1月17日
编辑:Stephen23 2017年1月17日
你失踪的事实MATLAB有两个零:正0和负0,这有不同的十六进制值。这是一个结果 IEEE 754 浮点标准MATLAB实现,它使用一个比特来表示数字符号:一个推论是,即使是零可以积极或消极的。
不可能使用<直接测试如果零是负的(根据定义积极负0 = 0,这是有道理的):
> > (0)< 0
ans =
0
但这是一个简单的技巧,将测试负0:
> > (1/-0)< 0
ans =
1
这依赖于行为:
> > 1/-0
ans =
> > 1 /轮(eps)%你的问题
ans =
整洁啊!
你可以在这里找到更多有趣的信息负0: