matlab的老师布置了这么一道作业题:尽管我们知道0.42-0.5+0.08与0.08-0.5+0.42是完全相等的,但在Matlab中,二者却不相等,请说明原因。
我大概是知道这与浮点数精度误差有关系,但是还是不能理解,若有误差,在两边数值及符号都完全相等的情况下。

>> 0.42+(-0.5+0.08)ans =0>> (0.42-0.5)+0.08ans =-1.3878e-17>> single(0.42-0.5)+single(0.08)ans =single0>> double(0.42-0.5)+double(0.08)ans =-1.3878e-17
  >> q = quantizer('double');
num2bin(q,0.08)ans ='0011111110110100011110101110000101000111101011100001010001111011'>> q = quantizer('double');
num2bin(q,-0.08)ans ='1011111110110100011110101110000101000111101011100001010001111011'>>  q = quantizer('double');
num2bin(q,(0.42-0.5))ans ='1011111110110100011110101110000101000111101011100001010001111100'

参考Why is 0.3 - 0.2 - 0.1 (or similar) not equal to zero?

https://matlab.fandom.com/wiki/FAQ#Why_is_0.3_-0.2-0.1.28or_similar.29_not_equal_to_zero.3F

经常提到的那样,某些浮点数不能完全以二进制形式表示。 这就是为什么您看到很小但不是零的结果的原因。 参见EPS。

区别在于0:0.1:0.4会增加一个非常接近但不完全为0.1的数字,原因如下。 因此,经过几步后,它将关闭,而[0 0.1 0.2 0.3 0.4]则将数字强制为正确的值,无论如何它们都可以准确地表示出来。

a=[0 0.1 0.2 0.3 0.4];b=[0:.1:.4];
as=sprintf('%20.18f\n',a)as =0.000000000000000000 % ==0.100000000000000010 % ==0.200000000000000010 % ==0.299999999999999990 % ~= bs !0.400000000000000020 % ==
bs=sprintf('%20.18f\n',b)bs =0.000000000000000000 % ==0.100000000000000010 % ==0.200000000000000010 % ==0.300000000000000040 % ~= as !0.400000000000000020 % ==
-and-format hex;hd=[a.',b.']hd =0000000000000000   0000000000000000 % ==3fb999999999999a   3fb999999999999a % ==3fc999999999999a   3fc999999999999a % ==3fd3333333333333   3fd3333333333334 % ~= !3fd999999999999a   3fd999999999999a % ==

如果要比较两个浮点数,不建议使用==进行比较。

另一种比较方法是检查要比较的两个数字是否“足够接近”(在彼此的公差值范围内)。 例如

% Instead of a == b% If you have MATLAB release R2015a or later, use:a = 0.3;b = 0.1 + 0.2;tol = 5 * eps(a) % A very small value.areEssentiallyEqual = ismembertol(a, b, tol) % areEssentiallyEqual is a logical (a true or false value).
% Instead of a == b
% with releases R2014b and earlier, use:
a = 0.3;b = 0.1 + 0.2;tol = 5 * eps(a)areEssentiallyEqual = abs(a-b) < tol
% for some small value of tol relative to a and b

您可以在MATLAB之外看到相同的行为。 使用铅笔和纸(或黑板或白板等)计算x = 1/3至所需的小数位数。 但是,小数位数必须是有限的。 现在计算y = 3 * x。 用精确的算术,y恰好是1; 但是,由于x并非正好是三分之一,而是四舍五入到三分之一的近似值,因此y不会正好为1。

参考

有关浮点运算的可读介绍,请参阅1996年Cleve’s Corner的文章:
www.mathworks.com/company/newsletters/news_notes/pdf/Fall96Cleve.pdf

For a readable introduction to floating point arithmetic, look at Cleve's Corner article from 1996: Floating Points (PDF) (http://www.mathworks.com/company/newsletters/news_notes/pdf/Fall96Cleve.pdf)For an official "Answer" by the Mathworks in the Answers forum, read Why-does-mat2str-0-005-90-return-0-0050000000000000001-in-matlabFor more rigorous and detailed information on floating point arithmetic, read the following paper: What Every Computer Scientist Should Know About Floating Point Arithmetic (http://docs.sun.com/source/806-3568/ncg_goldberg.html)Another resource is Technical Note 1108 (http://www.mathworks.com/support/tech-notes/1100/1108.html) on the Support section of The MathWorks website.And yet another is Loren's blog A Glimpse into Floating-Point Accuracy

for 问题

“Cannot determine the exact number of iterations for a loop with range ”

%#codegen
ctr=1;
for A = (y_prev-0.01):0.001:(y_prev+0.01)
% Some Calculations
B(ctr) = %some algebraic expression based on the variable "x"
ctr=ctr+1;
end
temp = (y_prev-0.01):0.001:(y_prev+0.01);
y = max(temp(B == max(B)));

非整数或2的幂(例如1/2)的步长会导致舍入误差,这会导致难以预测确切的迭代次数。

You could, for example, use

for At = -10:10A = y_prev - At/1000;

0.42-0.5+0.08与0.08-0.5+0.42是不完全相等,Why is 0.3 - 0.2 - 0.1 (or similar) not equal to zero?相关推荐

  1. java1男0女_Java项目中数据库字段和用户页面显示之间的转换,比如性别字段:1显示男,0显示女...

    开发项目的过程中,经常会碰到这样的问题:学生信息管理系统中,学生的专业.性别字段,底层数据库中存储的信息和在页面显示的是不同步的.比如:性别字段数据库中1代表男,0代表女,而界面上需要我们显示男或者女 ...

  2. c语言08,C语言08 -- 指针

    // // main.m // C8-指针 // // Created by dllo on 15/7/9. // Copyright (c) 2015年 Gaozi. All rights rese ...

  3. [导入]silverlight 2.0希伯来语及阿拉伯语的support.zip(344.42 KB)

    这个项目提供silverlight 2.0与希伯来语及阿拉伯语的support.including从右到左的支持,统一到右及视觉textwrapping功能.  目前,我们在阿尔法测试阶段silver ...

  4. c语言中转义字符 0,【填空题】在C语言中,用“\\”开头的字符序列称为转义字符, 转义字符‘\\n’的功能是_____; 转义字符‘\\0’的功能是_____;...

    [填空题]在C语言中,用"\\"开头的字符序列称为转义字符, 转义字符'\\n'的功能是_____; 转义字符'\\0'的功能是_____; 更多相关问题 在MGB1420万能磨床 ...

  5. php表达式ax 2 bx c=0,设a,b,c为互不相等的非零实数,求证:方程ax2+2bx+c=0,bx2+2cx+a=0,cx2+...

    二语习得专家克拉申(Krashen)提出要在语言教学中提供比学习者水平稍微高一点的"可理解的语言输入",这一理论称为( ) 147.水准测量中,水准仪的i角对测量结果的影响可用( ...

  6. 华为鸿蒙2.0智慧屏,官宣!华为车载智慧屏将于10月30日发布,或搭载鸿蒙OS 2.0...

    10月27日,华为官方宣布,华为车载智慧屏将于10月30日发布,国行华为 Mate40 系列新品也将一同亮相. 据悉,华为车载智慧屏或搭载华为鸿蒙OS 2.0系统,聚合了华为智能手机的大部分适合汽车移 ...

  7. python61到08使用说明书_python 08 文件操作

    ctrl + s 保存至磁盘 .exe .txt  .ppt .jpg 文件格式 open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写 open(filenam ...

  8. 本周首次公开专利数量最多的主要公司(2022.08.01~2022.08.07日)

    数据说明:数据来源专利顾如,会因为数据公开周期等因素造成一定误差,未考虑特殊情况,与任何指标无关,以官方公开数据为准仅供参考. 2022年08月01日 ~2022年08月07日 第一次公开专利并且专利 ...

  9. opensuse 42.2 mysql_【Linux】Grub模式硬盘安装openSUSE 42.2

    首先确保可以进去到grub,grub进入方法有很多,easybcd安装grub启动,或者使用grub4dos,可以参考grub的安装配置.这里建议使用grub4dos. 注意:BIOS中最好禁用acp ...

  10. parseInt(08)或parseInt(09)转换返回0的解决办法

    在javascript中使用parseInt()函数转换成整数时会遇到以下这种情况: 使用parseInt()转换'01'~'07'时可以转换成整数1~7,而转换'08'和'09'时,就会出现转换结果 ...

最新文章

  1. 导航,头部,CSS基础
  2. MySQL 5.7.2 发布,增强性能和可扩展性
  3. Android提高21篇之二:SurfaceView的基本使用方法
  4. Python OpenCV学习笔记之:分水岭算法分割图像
  5. Luogu4099 HEOI2013 SAO 组合、树形DP
  6. java经典算法四十题
  7. Android --- TabLayout 每一个选项卡前面加图标
  8. Kruskal Prim模板
  9. 在微型计算机中 存储容量为1kb 指的是,2016年计算机一级考试模板
  10. 利用finereport建设保险公司决策分析系统的思路和方法
  11. BZOJ P1059 [ZJOI2007]矩阵游戏——solution
  12. centos7建站php_Centos7PHP环境搭建
  13. php 获取 拼音,php获取汉字拼音(一)
  14. 汽车Bootloader原理
  15. 平面广告创意设计4大原则
  16. 基于消息系统架构设计
  17. 爬壁机器人外文文献_仿生爬壁机器人的研究现状
  18. 金大侠的亲属与剑桥大学最厉害的三个学院
  19. IT桔子在线教育沙龙
  20. 网络项目实施方案介绍

热门文章

  1. java after 函数_函数周期表丨信息丨值丨ISONORAFTER
  2. RxJava在Android中的简单应用
  3. 四川大学计算机应用基础第二次作业,四川大学川成教2017年秋季《计算机应用基础》第二次作业...
  4. 深入解析 Flink 细粒度资源管理
  5. mysql中 s命令_MySQL的基本操作命令
  6. python的变量在使用前不需要先赋值_每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。_学小易找答案...
  7. java string对象,java中String对象
  8. c++ idea 插件_IDEA的基本使用:让你的IDEA有飞一般的感觉
  9. 老版本xcode下载_下载xcode旧版历史版本
  10. pythonATM,购物车项目实战_补充4-db模块