在C++中,两个浮点数平方和可以为负数吗?

Ale*_*son 4 c++ floating-point software-quality

我有一段计算两个平方之和的代码float

float a, b, c;
// assign some random float to b and c
a = b*b+c*c;
Run Code Online (Sandbox Code Playgroud)

a两个 s 的平方和可以float为负数吗?

原始代码片段位于函数内部,因此提出问题的另一种方式如下:

bool fun(float b, float c)
{
   return b*b+c*c<0;
}
Run Code Online (Sandbox Code Playgroud)

是否有任何一对值bc给出fun(b,c)==true

Bat*_*eba 7

float在 IEEE754 下这是不可能的,因为没有为或定义环绕行为double

假设您将if is定义a为负数。假设我们继续将分析限制在 IEEE754 范围内,这可以方便地让我们忽略 NaN 情况。a < 0.0true

因此,在上述假设下,两个平方和不可能为负数。就算是a那就-0.0一定a * a0.0。此外,如果a-infa * a必须是+inf(数学家对此很满意,因为可数无穷大的平方也是可数的)。两个平方之和将不小于组成该和的两个平方中的任何一个。


但是,请注意, C++ 标准并未正式定义浮点溢出的行为。我们很幸运,IEEE754 无处不在并且定义了溢出。一个实现可能有一个浮点方案,它确实实现了某种对负值的环绕。

为了安全起见,请测试一下

std::numeric_limits<float>::is_iec559
Run Code Online (Sandbox Code Playgroud)