相关疑难解决方法(0)

比较C或C++中两个浮点值的总和

假设您有两组根据IEEE754实现的浮点变量,意味着将其视为根据标准中的公式计算的精确值.所有合法价值都是可能的.集合中的变量数量可以是任何自然数.

在数学意义上,比较精确的,由所述变量表示的值的总和是什么是好的方法.由于域的性质,问题可以很容易地表示为将单个总和与零进行比较.您可以忽略存在NaN或Infinities的可能性,因为它与核心问题无关.(可以轻松独立地检查这些值,并以适合此问题的特定应用的方式采取行动.)

一种天真的方法是简单地求和和比较,或者将一组的值和另一组的值相加.

    bool compare(const std::vector<float>& lhs, const std::vector<float>& rhs)
    {
        float lSum = 0.0f;
        for (auto value : lhs)
        {
            lSum += value;
        }
        float rSum = 0.0f;
        for (auto value : rhs)
        {
            rSum += value;
        }

        return lSum < rSum;
    }
Run Code Online (Sandbox Code Playgroud)

很明显,在关于浮点运算的各种其他问题中提到的天真方法存在问题.大多数问题都与两个困难有关:

  • 浮点值的相加结果根据顺序而不同
  • 添加某些值集的某些顺序可能导致中间溢出(计算的中间结果超出可用数据类型支持的范围)

    float small = strtof("0x1.0p-126", NULL);
    float big = strtof("0x1.8p126", NULL);
    
    std::cout << std::hexfloat << small + big - big << std::endl;
    std::cout << std::hexfloat << (big-2*small) + (big-small) + big - (big+small) - …
    Run Code Online (Sandbox Code Playgroud)

c c++ floating-point rounding-error overflow

1
推荐指数
1
解决办法
397
查看次数

标签 统计

c ×1

c++ ×1

floating-point ×1

overflow ×1

rounding-error ×1