前言

对于精度误差这个词的认识是在看别人写的sqrt函数应用时开始的,现在并没有在这方面遇到过问题,下面的经验是对所看过这一类文章的总结


一、什么是精度误差

比如这里我们用一个double去接收一个六位精度的值,那么前六位数的值一定是固定的,但是六位以后的值由于没有固定的输入将会是任意可能出现的数值。同理我们如果存入0给double在0以后位数的值也都是不确定的,这种不确定位数的值不可控的现象就是精度误差。

二、精度误差事例即解决方法

1、sqrt判断质数

一般的判断质数的代码都是如下的,我一开始也是这么写的。

bool find(int n)
{for(int i=2;i<=sqrt(n);i++){if(n%i==0)return false;}return true;
}

但这样的写法其实是不严谨的,比如说我判断9是不是素数,这时候sqrt(9)的值本应该是3,但其实sqrt的返回值是一个浮点数,所以这里的精度误差就可能导致返回值为2.9999999这一类数,从而导致答案的错误,正确的写法应该如下。

bool find(int n)
{int sql=(int)sqrt(1.0*n);//1.0*n的目的是  隐式转换成浮点数,开根号后再强制转换成整型 for(int i=2;i<=sql;i++){if(n%i==0)return false;}return true;
}

2、判断浮点数相等

即使是理论上相同的值,由于是经过不同的运算过程得到的,他们在低几位有可能(一般来说都是)是不同的。这种现象看似没太大的影响,却会一种运算产生致命的影响: ==。注意,C/C++中浮点数的==需要完全一样才能返回true,解决的办法是引进eps,来辅助判断浮点数的相等。

eps缩写自epsilon,表示一个小量,但这个小量又要确保远大于浮点运算结果的不确定量。eps最常见的取值是1e-8左右。引入eps后,我们判断两浮点数a、b相等的方式如下

这样,我们才能把相差非常近的浮点数判为相等;同时把相差较大(差值大于eps)的数判为不相等。

3、eps解决函数越界

如果sqrt(a), asin(a), acos(a) 中的a是你自己算出来并传进来的,那么就有可能因为浮点误差导致出现错误。如果a本来应该是0的,由于浮点误差,可能实际存储的是一个绝对值很小的负数(比如1e-12),这样sqrt(a)应得0的,直接因a不在定义域而出错。

类似地,如果a本来应该是±1,则asin(a)、acos(a)也有可能出错,对于此种函数,必需事先对a进行校正。

4、eps解决输出问题

这一节都是因为题目要求输出浮点数导致的问题,并且都和四舍五入有关。

现在考虑一种情况,题目要求输出保留两位小数。case的正确答案的精确值是0.005,按理应该输出0.01,但你的结果可能是0.005000000001(恭喜),也有可能是0.004999999999(悲剧),如果按照printf(“%.2lf”, a)输出,那你的遭遇将和括号里的字相同。

解决办法是如果a为正,则输出a+eps, 否则输出a-eps

5、 输入值波动过大

假如一道题输入给一个浮点数a, 1e-20 < a < 1e20。这时候就不要再用1e-8左右作为eps的值了,合理的做法是把eps按照输入规模缩放到合适大小。


总结

在对set进行判重的时候,是不是用==来判重的?经观察,set不是通过==来判断相等的,是通过<来进行的,具体说来,只要a<b 和 b<a 都不成立,就认为a和b相等,可以发现,精度误差问题可以用这个方法或者eps很好的解决的。容易产生较大浮点误差的函数有asin、 acos,所以尽量使用atan2。另外,如果数据明确说明是整数,而且范围不大的话,使用int或者long long代替double都是极佳选择.

精度误差问题与eps相关推荐

  1. 避免数字计算精度误差的方法详解

    0.1 + 0.2 = 0.30000000000000004 0.8 - 0.6 = 0.20000000000000007 因为计算机读懂的是二进制,而不是十进制 把 0.1 和 0.2 转换成二 ...

  2. matlab浮点运算的误差,MATLAB的eps,浮点数相对精度

    MATLAB的eps函数,官方帮助文档是这么描述的:Floating-point relateive accuracy,也就是浮点数的相对精度. 大家都知道,在数学中,实数有无穷多个,数值可以无限大, ...

  3. 三点法求三维坐标精度误差评估实验

    1. 实验目的 1) 对实验做一个系统性的误差评价. 2) 验证本实验的精度能否达到测量空间角的要求. 2.  实验原理 参考论文[1]进行误差评估实验,但是由于论文中的评定指标并不都适合本次实验,所 ...

  4. 详解 impala的ndv()函数 原理(HyperLogLog (HLL))、使用方法、精度误差及替换方案

    背景 最近使用impala做查询的时候,遇到一个sql 中使用多个列 count(distinct) 查询导致报错的情况,报错内容如下: org.apache.hive.service.cli.Hiv ...

  5. 数值计算机械精度误差最大值,机械精度设计试题汇编

    互换性原理与检测技术 一.填空题 1.公差标准是对 几何量误差 的限制性措施,采用相应的技术措施 是贯彻公差与配 合制的技术保证. 2.轴φ50js8,其上偏差为 +0.019 mm,下偏差为 -0. ...

  6. HUSTOJ特判程序Special Judge使用方法整理

    2021.08.12更新:最新优化的编写方法请参见https://blog.csdn.net/winter2121/article/details/104901188 Special Judge 通常 ...

  7. 【学习笔记】计算几何

    常用函数 一些基本定义 为了简化代码,我打出了 # define ConP const Point& 防止精度误差而常见 EPS=10−9EPS=10^{-9}EPS=10−9(注:为了缩短篇 ...

  8. 浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

    在知乎上上看到如下问题: 浮点数精度问题的前世今生? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3.大家在项目中踩过浮点数精度的坑? 4.最后采用哪些方案规避 ...

  9. 64位浮点数_JavaScript 浮点数运算的精度问题

    问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...

最新文章

  1. python下载安装教程3.7.3-【最新】Python-3.7.0安装教程及下载链接
  2. 比特币钱包(5) BIP44 账户表示形式
  3. 2015/4/14课堂练习
  4. Chapter1-6_Speech_Recognition(RNN-T Training)
  5. php mysql单引号 双引号_php单引号、双引号与数据库
  6. UVA11027 Palindromic Permutation【回文】
  7. asp和php漏洞,ASP_实例分析ASP上传漏洞入侵实战及扩展,【上传漏洞欺骗技术】 - phpStudy...
  8. Citrix 桌面云 XenApp_XenDesktop_7.15 部署系列(八)部署虚拟桌面及应用
  9. 常见的图像分割方法有以下几种
  10. ps学习——基本工具
  11. widows计算器恢复
  12. Mac触摸板鼠标自定义手势---Jitouch使用教程,让你的效率飞起来(使用过程以及遇到的坑)
  13. iOS开发中extension的用法(延展)
  14. Android4.1 如何实现状态栏上信号图标有SIM卡1,2标记,并且当处于2G状态显示“G”,处于3G状态显示“3G”
  15. 学校教材订购系统课程设计
  16. 极客日报:同一个手机号或可注册两个微信号;第三代AirPods不再支持iPhone 6等老手机
  17. 数论-模运算与同余的性质
  18. 回环地址--Loopback
  19. 《Python核心技术第二版》笔记
  20. 如何彻底删除hao123的桌面快捷方式

热门文章

  1. python中变量,python中变量的概念
  2. python案例解析_python案例讲解
  3. 2017幼儿园计算机培训,2017-2018学年度幼儿教师培训记录.doc
  4. wait()和sleep的区别
  5. 长尾词推广系统推荐乐云seo_AI万词霸屏系统-长尾词全网推广+主词SEO排名【since 2014】...
  6. JavaComplier的使用
  7. FastAdmin表格自定义操作按钮
  8. 计算机专业怎样弘扬劳模精神,如何弘扬劳模精神的作文1000字
  9. 711 的成功之道 - 读《零售的哲学》
  10. 数据库的三级模式结构和两级映射