算法小白的心得笔记:比较小数点后五位,而不会受到浮点数精度问题的影响。

epsilon 来比较浮点数

c++ 复制代码
double epsilon = 1e-6; // for 6 decimal places
for (const auto &ratio : colorRatio)
{
    std::cout << "__" << inum << "__" << ratio << " ";

    if ((inum - 1) % 10 == 0)
    {
        std::cout << std::endl;
    }

    if (!std::isnan(ratio) && !std::isnan(beta3[inum - 1]))
    {
        if (std::abs(ratio - beta3[inum - 1]) > epsilon)
        {
            std::cerr << "\n __" << inum << "__ 计算错误 " << ratio << " 应该是 " << beta3[inum - 1] << std::endl;
            return 1;
        }
    }
    inum++;
}

double epsilon = 1e-6; // for 6 decimal places

我们可以设置 epsilon 的值来指定有效精度位,如 1e-5是五位精度。

可以比较负数的版本

在上述代码中,我们使用的是std::abs函数来计算两个浮点数之间的差的绝对值,这个函数同样适用于负数。因此,无论你的浮点数是正数还是负数,这段代码都能正确地比较它们的差是否小于epsilon。

如果你的ratiobeta3[inum - 1]都可能是负数,并且你想要比较它们的绝对值,你可以在比较之前先使用std::abs函数将它们转换为正数,如下所示:

cpp 复制代码
if (std::abs(std::abs(ratio) - std::abs(beta3[inum - 1])) > epsilon)
{
    std::cerr << "\n __" << inum << "__ 计算错误 " << ratio << " 应该是 " << beta3[inum - 1] << std::endl;
    return 1;
}

这段代码会先计算ratiobeta3[inum - 1]的绝对值,然后再比较它们的差是否小于epsilon。这样,无论你的浮点数是正数还是负数,这段代码都能正确地比较它们。

可能出现的一些问题

由于浮点数在计算机中的表示和存储方式导致的相等内容被判定为不相等。

这个问题可能是由于浮点数在计算机中的表示和存储方式导致的。浮点数在计算机中的表示并不是完全精确的,因此即使两个浮点数在理论上应该相等,但由于精度问题,它们可能在计算机中不相等。

在上述的代码中,使用了一个非常小的正数(称为"epsilon"),如果两个浮点数的差的绝对值小于这个epsilon,那么我们就可以认为这两个浮点数是相等的。这是一种常见的处理浮点数精度问题的方法。

然而,如果epsilon 设置得太小了,导致了这个问题。 可以尝试增大epsilon的值,例如将其设置为1e-5或1e-4,看看是否能解决这个问题。

另外, 也可以尝试使用其他的比较浮点数的方法,例如使用std::nextafter函数。这个函数可以返回在给定方向上,距离给定浮点数最近的下一个可表示的浮点数。你可以使用这个函数来比较两个浮点数是否相等,如下所示:

cpp 复制代码
if (ratio != std::nextafter(beta3[inum - 1], std::numeric_limits<double>::lowest()) &&
    ratio != std::nextafter(beta3[inum - 1], std::numeric_limits<double>::max()))
{
    std::cerr << "\n __" << inum << "__ 计算错误 " << ratio << " 应该是 " << beta3[inum - 1] << std::endl;
    return 1;
}

这段代码会比较ratio是否等于beta3[inum - 1]的下一个或上一个可表示的浮点数。如果不等于,那么我们就认为这两个浮点数不相等。这种方法可以更精确地比较浮点数,而不会受到精度问题的影响。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

相关推荐
程序员-King.5 小时前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
优雅的潮叭5 小时前
c++ 学习笔记之 chrono库
c++·笔记·学习
月挽清风6 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室6 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
不大姐姐AI智能体6 小时前
搭了个小红书笔记自动生产线,一句话生成图文,一键发布,支持手机端、电脑端发布
人工智能·经验分享·笔记·矩阵·aigc
小郭团队7 小时前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
充值修改昵称7 小时前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
Deepoch7 小时前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业
浅念-7 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
Hcoco_me8 小时前
大模型面试题84:是否了解 OpenAI 提出的Clip,它和SigLip有什么区别?为什么SigLip效果更好?
人工智能·算法·机器学习·chatgpt·机器人