【发布时间】:2010-06-02 02:05:54
【问题描述】:
如果我想检查正浮点数 A 是否小于另一个正浮点数 B 的平方反比(在 C99 中),如果 B 非常小,会出现问题吗?
我可以想象像这样检查它
if(A<1/(B*B))
但是如果 B 足够小,这可能会导致无穷大吗?如果发生这种情况,代码是否仍能在所有情况下正常工作?
以类似的方式,我可能会这样做
if(1/A>B*B)
...这可能会稍微好一些,因为如果 B 很小,B*B 可能为零(这是真的吗?)
最后,一个我无法想象是错误的解决方案是
if(sqrt(1/A)>B)
我认为这不会导致除法为零,但如果 A 接近于零,仍然可能会出现问题。
所以基本上,我的问题是:
- 如果 X 大于零(但很小),那么 1/X 能否成为无穷大?
- 如果 X 大于零,X*X 是否可以为零?
- 与无穷大的比较会按照我的预期进行吗?
编辑:对于那些想知道的人,我最终做了
if(B*A*B<1)
我是按这个顺序做的,因为它在视觉上是明确的,哪个乘法首先发生。
【问题讨论】:
-
你说的有多小?你可能对
0.0000000000000000000000003有一些问题,可以这么说,但如果不知道你的输入浮点数的精度是多少,就很难回答这个问题。 -
AFAIK,你可能会得到一个小除数的算术溢出,但不是零除数错误。
-
if ( A*B*B < 1 )怎么样? -
B 输入来自用户图形滑块或文本输入,因此我应该能够优雅地处理任何大小,即使某些淘气的人输入 0.0000000000000000000000003。 A 输入来自大于十左右数字的浮点减法计算,所以我也希望它可能非常小,但小得离谱,因为它应该失去准确性。
-
Nikolai,我想你可能有解决办法。这绝不会导致任何溢出或除以零,这正是我正在寻找的答案。您应该将其发布为答案!
标签: c floating-point division divide-by-zero