假设您有两组根据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)