划分1 /非常小的浮子时会发生坏事吗?

如果我想检查正浮点数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)

我按顺序做了,因为它在视觉上是明确的,首先发生乘法.

解决方法

如果你想处理A和B的所有可能值,那么你需要小心一点,但这并不是太复杂.

建议使用* b * b< 1.是一个好人;如果b很小,a * b * b下溢到零,那么a必然小于1./(b*b).相反,如果b太大而a * b * b溢出到无穷大,那么条件将(正确地)不满足. (Potatoswatter正确地在另一篇文章评论中指出,如果你把它写成b * b * a,这不能正常工作,因为即使条件应该为真,b * b可能溢出到无穷大,如果恰好是非正规的话.但是,在C中,乘法从左到右关联,因此如果您将其写为* b * b且您的平台遵循合理的数字模型,则不会出现问题.) 因为您事先知道a和b都是正数,所以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可以溢出并产生无穷大.例如,在默认舍入模式下的双精度,1 / 0x1.0p-1024将溢出.

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

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

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

是!这是IEEE-754的最佳功能之一.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...