首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一个浮点值x,其中的x == 0是假的?

是否有一个浮点值x,其中的x == 0是假的?
EN

Stack Overflow用户
提问于 2010-04-21 21:19:01
回答 6查看 5K关注 0票数 21

在大多数情况下,我知道浮点比较测试应该使用一系列值(abs(X)< epsilon)来实现,但自减是否意味着结果将为零?

代码语言:javascript
复制
// can the assertion be triggered?
float x = //?;
assert( x-x == 0 )

我猜想nan/inf可能是特例,但我更感兴趣的是对于简单值会发生什么。

编辑:

我很乐意选择一个答案,如果有人可以引用一个参考(IEEE浮点数标准)?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-04-21 21:22:44

正如您所暗示的,inf - infNaN,它不等于零。类似地,NaN - NaNNaN。然而,对于任何有限浮点数xx - x == 0.0 (取决于舍入模式,x - x的结果可能是负零,但负零比浮点算术中的0.0等于0.0),这是真的。

编辑:给出一个明确的标准参考有点棘手,因为这是IEEE-754标准中规定的规则的一个紧急属性。具体而言,这是根据第5条中定义的操作必须正确四舍五入的要求。减法就是这样一种操作( 5.4.1节“算术运算”),x - x的正确舍入结果是适当符号的零(第6.3节,第3段):

当有相反符号的两个操作数之和(或两个同符号操作数的差)完全为零时,除roundTowardNegative以外的所有四舍五入属性中,该和(或差)的符号应为+0;在该属性下,精确零和(或差)的符号应为−0。

因此,x - x的结果必须是+/- 0,因此必须与0.0进行比较(第5.11节,第2段):

比较应忽略零的符号。

进一步编辑:--这并不是说一个buggy的编译器不能使断言触发。您的问题是模棱两可的;没有有限的浮点数x,因此x - x == 0是假的。但是,这不是您发布的代码检查的内容;它检查C风格语言中的某个表达式是否可以计算为非零值;特别是在某些平台上,在某些平台上,在某些编译器优化的情况下,该表达式中变量x的两个实例可能具有不同的值,从而导致断言失败(特别是如果x是某种计算的结果,而不是一个常量的、可表示的值)。这是那些平台上的数字模型中的一个bug,但这并不意味着它不可能发生。

票数 61
EN

Stack Overflow用户

发布于 2010-04-21 21:31:23

如果表示被转换(例如,从64位内存格式转换为x86上的80位内部寄存器格式),那么在某些情况下可能会触发断言。

票数 4
EN

Stack Overflow用户

发布于 2010-04-21 21:20:38

是的,除了特例外,x-x总是0。但x*(1/x)并不总是1 ;-)

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

https://stackoverflow.com/questions/2686644

复制
相关文章

相似问题

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