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)
是否有任何一对值b和c给出fun(b,c)==true?
float在 IEEE754 下这是不可能的,因为没有为或定义环绕行为double。
假设您将if is定义a为负数。假设我们继续将分析限制在 IEEE754 范围内,这可以方便地让我们忽略 NaN 情况。a < 0.0true
因此,在上述假设下,两个平方和不可能为负数。就算是a那就-0.0一定a * a是0.0。此外,如果a是-inf则a * a必须是+inf(数学家对此很满意,因为可数无穷大的平方也是可数的)。两个平方之和将不小于组成该和的两个平方中的任何一个。
但是,请注意, C++ 标准并未正式定义浮点溢出的行为。我们很幸运,IEEE754 无处不在并且定义了溢出。一个实现可能有一个浮点方案,它确实实现了某种对负值的环绕。
为了安全起见,请测试一下
std::numeric_limits<float>::is_iec559
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |