gpt4 book ai didi

除以 1/一个非常小的 float 时会发生坏事吗?

转载 作者:太空狗 更新时间:2023-10-29 17:06:30 24 4
gpt4 key购买 nike

如果我想检查正 float A 是否小于另一个正 float 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) 

我是按这个顺序做的,因为从视觉上看,哪个乘法先出现是明确的。

最佳答案

如果您想处理 A 的整个可能值范围和 B , 那么你需要小心一点,但这真的不太复杂。

使用建议a*b*b < 1.是个好人;如果b太小了 a*b*b下溢为零,然后 a一定小于1./(b*b) .相反,如果 b太大了 a*b*b溢出到无穷大,则条件将(正确地)不满足。 (Potatoswatter 在另一篇文章的评论中正确地指出,如果您编写 b*b*a ,这不能正常工作,因为 b*b 可能会溢出到无穷大,即使如果 a 恰好是非正规的,条件应该为真。但是,在 C 中,乘法从左到右关联,因此如果您编写 a*b*b 并且您的平台遵循合理的数字模型,这不是问题。 )

因为您先验知道 ab都是正数,a*b*b没办法生成 NaN,因此您不必担心这种情况。上溢和下溢是唯一可能的不当行为,我们已经对它们进行了说明。如果您需要支持 a 的情况或 b可能为零或无穷大,那么您需要更加小心。

回答您的直接问题:(答案采用 IEEE-754 算法)

Can 1/X ever be infinity if X is greater than zero (but small)?

是的!如果 x 是一个小的正非正规值,则 1/x可以溢出并产生无穷大。例如,在默认舍入模式下的 double 中,1 / 0x1.0p-1024会溢出。

Can X*X ever be zero if X is greater than zero?

是的!在默认舍入模式下的 double 中,x 的所有值都小于 0x1.0p-538 (即 C99 十六进制格式的 2**-578)左右具有此属性。

Will comparisons with infinity work the way I would expect them to?

是的!这是 IEEE-754 的最佳特性之一。

关于除以 1/一个非常小的 float 时会发生坏事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2954560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com