(含Matlab源码)算术编码(arithmetic coding)的underflow问题

0、文章结构

文章的行文逻辑如下,看官可以根据需要跳读,节省时间。

1、介绍underflow和overflow.

2、underflow问题起源

3、underflow问起探索

4、underflow和overflow的常见情形

5、处理一些溢出问题的小技巧

6、对其中的两种小技巧的优缺点比较

 

1、什么是underflow和overflow

在计算机中浮点数都是离散的,有限的。因此计算机无法用有限的浮点数来表示无限的实数。在用浮点数表示实数时,很多数都会存在近似误差。其中一种是下溢(underflow)。比如,一个非常接近于零的数值A(实际上A>0),计算机会直接把该数值判为零,虽然实际上它并不为零。另一种数值误差是上溢(overflow),通俗而言,当一个数值a非常接近某一计算机表示的数值b时(实际a<b),计算机用b表示a。

 

2、起源-算术编码(arithmetic coding)作业初识underflow

音频老师布置一个作业,要求写一段程序实现算术编码,被编码的字符串为:ALIALIBABA

关于算术编码的原理详见:https://blog.csdn.net/qingkongyeyue/article/details/75216790?utm_source=blogxgwz8

这个很简单,很快就用matlab写出来了,最终和老师给的答案一样。

接着老师就布置了第二个算术编码的作业,实现对下方字符串的编码,包含空格。

DIGITAL AUDIO TECHNOLOGY AND APPLICATION

代码中输入该字符串,可是range输出值为0。

理论上来讲,range是一个非常非常小的值,但不等于零。

这时,突然意识到,老师上课时讲到的,程序在数值运算中出现underflow。

此时的溢出问题的代码:https://download.csdn.net/download/h763247747/10777261

 

3、关于underflow问题的探索

变量Range被计算机判为零,但是它实际上并不等于零。

那么在matlab中,数值小于多少会被计算机判为零呢?

EPS函数

EPS是MATLAB中的函数,表示浮点相对精度。 对双精度数值来说eps表示从 1.0 到下一个最大双精度数的距离。对单精度数值来说eps表示从 1.0 到下一个最大单精度数的距离。

在command window中输入:help eps

Matlab中变量默认为double类型,所以其判别值为2^(-52),相当于

所以当变量值小于2.22e(-16)时,计算机会直接判为零,这时就需要考虑underflow了。

 

 

 

4、常见数值误差的情形

由此引出另外一个问题:哪些情况会出现数值误差(underflow 或者overflow)?

下方部分内容来自于此论坛:http://www.ilovematlab.cn/thread-242321-1-1.html。

论坛里有非常多大佬的精彩留言,让人豁然开朗。

情形1-underflow

计算所得0.4的实际值小于0.4。

 

情形2-由underflow出现的错误

计算机中的计算值为3,并不等于4。

 

情形2-误差精度

控制台输出,可以发现误差越来越大。

 

对于情景2问题的分析

双精度浮点数在计算机中使用科学计数法存储,下图所示浮点数格式。

关于浮点数的更加详细信息:https://www.cnblogs.com/icmzn/p/5060195.html

两个浮点数相减时,会存在有效位数字的误差。

假如1.4-1在计算机中的表示为0.3999….9*e(0)(13个9)。

100000000.4-100000000=(1.000000004-1.00000000)*e(8)=0. 0000000039..9(5个9)*e(8)。

运算精度就变差了,误差也会增大。

 

情形3-overflow

 

 

情形4-由于overflow出现的错误

演示underflow和overflow使用的代码:https://download.csdn.net/download/h763247747/10777601

 

4、处理一些溢出问题的小技巧

4.1、判断两个数是否相等

可以使用如下公式:

abs(a-b) < eps(a) or eps(b)

如果不等式成立,则a,b相等。

4.2、解决underflow问题

比如floor((1.4-1)*10),matlab运行的结果为3,并不等于4。为了得到正确的代码,可以如下改写代码。overflow的问题也可以使用类似思路。

 

4.3、提高精度

a-b的结果小于eps(0)时,为了避免结果被计算机判为零,可以使用其它工具,比如advanpix提高精度,比如精确到小数点后200位。

4.4、移位

比如计算0.0000000000111-0.0000000000101时,可以先都乘以10^10,再相减,然后差值再除以10^10,这样可以提高计算精度。

 

5、提高精度和移位的比较

方法2可以更快的解决matlab中出现的溢出问题,但是方法3更加实用。因为在工程领域,很难找到类似advanpix的工具。比如老板要求在arm芯片上实现对音频的算术编码,这样只能用方法3了。

最后用方法4解决音频算术编码underflow问题的代码:https://download.csdn.net/download/h763247747/10777264

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Union与Union All的区别

Union与Union All的区别如果我们需要将两个select语句的结果作为一个整体显示出来&#xff0c;我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。union和union all的区别是,union会自动压缩多个结果集合中的重复结果&#xff…

人类与AI结合的最佳形态是什么样?|A16Z内部万字报告

来源&#xff1a;A16Z合伙人Frank Chen2017年7月&#xff0c;我发布了一个关于人工智能、机器学习和深度学习的入门视频。从那以后&#xff0c;我一直痴迷于阅读关于机器学习的报道。一般来说&#xff0c;你会在媒体的头版上看到两类报道。一类报道的标题是“机器人来抢你的工作…

(Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)

1、代码功能 输入&#xff1a;一个字符串输出&#xff1a; codeword&#xff08;码值&#xff09; codeword所占的位数 2、代码框图 3、代码超详解 统计字符串中的字符种类&#xff0c;调用函数&#xff0c;放入数组b中。 bunique(str1); 统计每种字符的个数&#xff0c;放入…

jquery获取select中的option的text值

<select id"ddd"><option id"22">fdsfds</option><option id"12">fdsfds</option><option id"32">哈哈</option><option id"42">嘻嘻</option></select>1.你的…

(含Python源码)Python实现K阶多项式的5种回归算法(regression)

0、文章结构 为了方便客官根据需要取阅&#xff0c;节约时间&#xff0c;文章目录结构如下&#xff1a; 问题描述理论部分&#xff1a;五种回归算法两种Python读取文件的方法Python实现五种回归算法使用的工具箱总结 1、问题描述 K阶多项式表达式 其中&#xff0c; 现有数据…

首张人类黑洞照片的背后

摘要&#xff1a;沈海军&#xff1a;今天&#xff08;2019年4月10日&#xff09;下午接受广东卫视采访&#xff0c;就晚上21:00即将发布的人类首张黑洞照片发表了评论。提笔撰稿时&#xff0c;尚未到照片官方的发布时间&#xff0c;故不能一睹黑洞照片的芳容&#xff0c;但鉴于…

svn is already under version control问题解决

svn ci 时出现 xx is already under version control&#xff0c;然后无法提交&#xff0c;出现这个问题的原因是你所提交的文件或目录是其他SVN的东西&#xff0c;即下面有.svn的目录&#xff0c;需要先把它们删除才能提交&#xff0c;具体操作如下&#xff1a; 打开出现问题的…

(Matlab函数详解)机器学习中的4种分类算法(LDA、QDA、SVM、KNN)

1、LDA(Linear discriminant analysis) 函数&#xff1a;[class, err]classify(sample, training, group); 输入&#xff1a;sample待测样本&#xff0c;% 矩阵 m*n m为样本数&#xff0c;n为特征数 training训练样本&#xff0c;% 矩阵k*n k为样本数&#xff0c;n为特征数&…

一场“交通进化”将至: 5G带给车联网与自动驾驶哪些升级?

来源 &#xff1a;腾讯科技作者&#xff1a;李俨 美国高通公司技术标准高级总监5G时代已经来临&#xff0c;走向商用的步伐也在逐渐加快。腾讯科技联合优质科技CP以及行业专家推出“5G局中局”系列文章&#xff0c;为你解读5G在通讯、物联网、车联网、工业联网、边缘计算、云服…

产品经理的几个阶段

产品经理是这几年最火热的互联网职位之一&#xff0c;随着这些年的发展积累了大量的顶着产品经理称号的年轻人。虽然在数量上有了巨大的增长&#xff0c;但是在我们实际的工作招聘中却很悲哀的发现&#xff0c;很多产品岗位死活招不到人&#xff1b; 甚至好不容易花个大价钱挖到…

(一看就懂)傅里叶变换、拉普拉斯变换、Z变换、卷积的经典文章汇总

0、前沿 在复习傅里叶变换、拉普拉斯变换、Z变换和卷积等知识时&#xff0c;我发现网上有非常非常多的大牛。他们用通俗易懂的语言来讲解这些复杂的知识&#xff0c;使人豁然开朗。 1、连续时间信号的傅里叶级数与傅里叶变换 如果现在还无法理解&#xff0c;为什么要对信号进…

特斯拉发布Q1无人驾驶安全报告:事故增多 但还是比人类少

来源&#xff1a;聚焦AI的近日&#xff0c;电动汽车制造商特斯拉发布了2019年第一季度自动驾驶仪&#xff08;Autopilot&#xff09;安全性报告&#xff0c;这是特斯拉发布的第三份类似报告&#xff0c;此前该公司认为媒体对特斯拉车辆事故的报道有失公允&#xff0c;因此他们开…

log4net 小记

突然想到想测试一下log4net&#xff0c;结果折腾了两天&#xff0c;才弄出来.....记录下来以备以后查看 背景&#xff1a;vs2013 mvc项目中想体验下log4net的功能&#xff08;主要是文件记录&#xff09; 翻看了log4net的相关资料&#xff0c;才发现其实它是有很多功能的&#…

关于找工作和选专业的思考

个人的成长离不开国家的发展&#xff0c;国家的发展离不开国际的大气候。 国家之间的竞争主要归于经济竞争&#xff0c;经济的核心在于产业&#xff0c;产业的核心则在于科学和技术。 无论是找工作还是选专业&#xff0c;赌的都是对未来趋势的预测&#xff0c;没有人会希望自己…

DARPA 2020财年研发预算 人工智能应用研究投资急剧增长

来源&#xff1a;美国国防部等摘要&#xff1a;2019年3月&#xff0c;特朗普政府公布2020财年预算申请。根据预算法案&#xff0c;2020财年美国国家安全预算总额增加340亿美元&#xff0c;达到7500亿美元&#xff0c;比上年增加5%。美国防部分得的经费为7180亿美元&#xff0c;…

使用Matlab(R2018b)画复杂函数的图形(网格图meshgrid)及等高线contour

1、函数 这里使用2D Michalewicz 函数&#xff0c;其表达式为&#xff1a; 2、画图 2.1 编写2D Michalewicz 函数 f(x,y)(-sin(x).*(sin(x.^2/3.1415926)).^(2*m)...-sin(y).*(sin(2*y.^2/3.1415926)).^(2*m)); 上述代码使用到了Anonymous Functions, 相关变量的数据类型为…

深入浅出requireJS-1

我们都知道&#xff0c;虽然我们可以通过原型和继承来使javascript面向对象。但是&#xff0c;当js代码和逻辑过多时&#xff0c;代码的维护和扩展会变的很不方便。这时&#xff0c;nodejs做的非常好&#xff0c;但是在浏览器端模块化的js编程一直都是个难题。而requireJS就是来…

科创板:中国科技产业新引擎

来源&#xff1a;国信研究作者&#xff1a;杨均明&#xff0c;国信证券经济研究所所长万众期待的上海证券交易所科创板即将推出&#xff0c;科创板股票发行审核规则第三条要求&#xff0c;发行人申请股票首次发行上市&#xff0c;应当符合科创板定位&#xff0c;面向世界科技前…

粒子群优化算法(Particle Swarm Optimization)的 Matlab(R2018b)代码实现

这里以 2D Michalewicz function 为对象来演示粒子群算法。 1、Michalewicz function 2、代码详解 2.1 画Michalewicz函数的网格图形 f(x,y)(-sin(x).*(sin(x.^2/3.1415926)).^(2*m)...-sin(y).*(sin(2*y.^2/3.1415926)).^(2*m));range[0 4 0 4]; Ngrid100; dx(range(2)-ran…

javascript excel

js做的 excel &#xff0c; http://handsontable.com/ js keyCode对照表 http://dwz.cn/Lknbz转载于:https://www.cnblogs.com/qq-757617012/p/4524448.html