float
如何确定用作除数的类型变量的有效值以避免被零除错误?与零比较就够了吗?
float f;
//...
if (f != 0.f)
1.f / f;
这里有一个类似的问题,其中VladD指的是IEEE-754,它是有保证的:
如果 v > 0 且 h == 0 则 v/h == INFINITY
如果 v < 0 且 h == 0 则 v/h == -INFINITY
原则上,这将在除法之前消除对零的检查,但另一方面,标准6.5.5.5 说:
/ 运算符的结果是第一个操作数除以第二个操作数的商;% 运算符的结果是余数。在这两个操作中,如果第二个操作数的值为零,则行为是未定义的。
问题是,除以float
零是否安全,如果不安全,获得特定结果的测试条件应该是什么。
我怀疑语言标准应该依赖 IEEE-754 进行浮点运算,而其他一切都只处理整数。IEEE-754 标准规定非零值(包括无穷大)可以除以零得到无穷大。零除以零也是可以接受的,我们得到相当 NaN,即某种不确定性的模拟。
同意,如果处理器严格按照 IEEE-754 工作,但语言编译器不工作,那将很奇怪。
此外,如果您担心结果可能会变成无穷大,那么分母根本不必等于零,例如可以等于
0,5
,分子略大于最大可能值的一半。事实证明,为了避免无穷大的答案,0.0f
用检查 :) 我怀疑这种语言的创造者是否目光短浅以至于他们允许犯这样的错误。c
首先,我要注意的是,为了弄清楚在or中使用浮点数的规则c++
,您需要检查相应常量的值。那些。语言标准不保证这些规则是必需的,但可以查明实现是否支持特定类型的IEEE-754标准。语言标准的附件
F
(IEC 60559浮点运算c
)明确指出:您
c++
可以使用如下代码检查IEEE-754对真实类型的支持:如果提供支持,则应根据上述标准对该问题进行进一步研究。但正如实践所示,除以零错误只会在除以零时发生,尽管除以非零值时可以得到无穷大:
我们得到:
如果我们替换
min
为zero
,那么已经:因此,您需要自己决定您真正想要避免的事情:被零除或得到无穷大的错误。
根据IEEE-754条款 7.3,在两种情况下,只有对最终操作数的操作才会出现被零除异常: