当前位置: 首页 > news >正文

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

epsilon 来比较浮点数

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函数将它们转换为正数,如下所示:

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函数。这个函数可以返回在给定方向上,距离给定浮点数最近的下一个可表示的浮点数。你可以使用这个函数来比较两个浮点数是否相等,如下所示:

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

http://www.lryc.cn/news/220439.html

相关文章:

  • 11月起,33个省份纳入数电票开票试点范围内,发票无纸化已是大势所趋!
  • NLP之Bert多分类实现案例(数据获取与处理)
  • matlab中的mapminmax函数初步理解和应用
  • svc和ingress的关系
  • 可以使用以下代码对数据库查询结果进行分组统计
  • win10提示mfc100u.dll丢失的解决方法,快速解决dll问题
  • zookeeper:启动原理
  • kafka问题汇总
  • C#使用随机数模拟英雄联盟S13瑞士轮比赛
  • RabbitMQ(高级特性)利用限流实现不公平分发
  • 3 网络协议入门
  • 【星海出品】VUE(五)
  • 项目实战之安装依赖npm install
  • Java之图书管理系统
  • 用「埋点」记录自己,不妄过一生
  • 运维知识点-Docker从小白到入土
  • 基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程
  • MySQL和Java程序建立连接的底层原理(JDBC),一个SQL语句是如何执行的呢?
  • uniapp踩坑之项目:uniapp数字键盘组件—APP端
  • 聊一聊GPT——让我们的写作和翻译更高效
  • 413 (Payload Too Large) 2023最新版解决方法
  • uboot启动linux kernel的流程
  • 垃圾回收系统小程序定制开发搭建攻略
  • 可变参数模板
  • 坐公交:内外向乘客依序选座(python字典、字符串、元组)
  • 十年老程序员分享13个最常用的Python深度学习库和介绍,赶紧收藏码住!
  • 【pytorch源码分析--torch执行流程与编译原理】
  • 编辑器报警处理
  • Python库学习(十二):数据分析Pandas[下篇]
  • 工具: MarkDown学习