C++ 浮点数比较代码

#include <algorithm>
#include <cmath>
#include <iostream>

// 如果 a 和 b 之间的差异在 a 和 b 中较大者的 epsilon 百分比以内,则返回 true
bool approximatelyEqualRel(double a, double b, double relEpsilon)
{
	return (std::abs(a - b) <= (std::max(std::abs(a), std::abs(b)) * relEpsilon));
}

bool approximatelyEqualAbsRel(double a, double b, double absEpsilon, double relEpsilon)
{
    // 检查数字是否真的很接近——比较接近零的数字时需要。
    double diff{ std::abs(a - b) };
    if (diff <= absEpsilon)
        return true;

    // 否则退回到 Knuth 的算法
    return (diff <= (std::max(std::abs(a), std::abs(b)) * relEpsilon));
}

int main()
{
    // a 非常接近 1.0,但有舍入误差
    double a{ 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 };

    std::cout << approximatelyEqualRel(a, 1.0, 1e-8) << '\n';     // 将“几乎 1.0”与 1.0 进行比较
    std::cout << approximatelyEqualRel(a-1.0, 0.0, 1e-8) << '\n'; // 将“几乎 0.0”与 0.0 进行比较

    std::cout << approximatelyEqualAbsRel(a, 1.0, 1e-12, 1e-8) << '\n'; // 将“几乎 1.0”与 1.0 进行比较
    std::cout << approximatelyEqualAbsRel(a-1.0, 0.0, 1e-12, 1e-8) << '\n'; // 将“几乎 0.0”与 0.0 进行比较
posted @ 2023-02-16 13:50  Leafmoes  阅读(38)  评论(0编辑  收藏  举报