为何很大的浮点大数加一个很小的数计算结果不是预期

通常浮点数被表示成N=S*rj S称为尾数,可正可负,j称为阶码可正可负。r是基数,在计算机中取以2的倍数。

计算机中为了提高精度,进行规格化操作:即假设N=11.0101  则规格化表示为N=0.110101*210表示,因为该规格化使得浮点数的表示精度最高。

机器中浮点数由两部分组成:阶码和尾数。基数为2

阶码由阶符跟阶码组成,尾数由数符跟尾数组成

其中阶码是整数,阶符和阶码的位数m合起来反映浮点数的表示范围及小数点的实际位数。尾数是小数,其位数反映了浮点数的精度。

还有机器零这个概念:即浮点数尾数为0,或者阶码小于等于所能表示的最小数。机器都把该浮点数看成0.并称该0为机器0.

计算机中两个浮点数加减法的运算步骤:

1、对阶,使两个数的小数点位置对齐。则需要使阶码一样。也就是咱们数学经常做的x*100+y*1000 = x*0.1*1000+y*1000  因为计算机中对阶是低阶向高阶对齐。则当两个数值相差很大的时候,在进行对阶的时候小数点需要向左移动,导致末端的数据会出现丢失的现象。一个很简单的例子,比如0.10100*2100跟0.10000*21000,则进行对阶的时候则小的这个数需要阶码需要加100,又因为精度为5位,则使得左边的数表示为0.00001*21000而导致出现精度丢失现象。

2、尾数求和。则如第一个例子的0.10100*2100跟0.10000*21000对阶相加之后的结果为0.10001*21000

3、规格化,即将小数点的最高位移到为1,因为当前最高位为1所以不用移动

4、舍入,为提高精度,考虑尾数右移时丢失的数值。

5、溢出判断。

这里只讲为啥相加会有精度丢失的现象。相减也是同一个道理,对阶导致的精度丢失。

时间: 2024-10-10 18:29:43

为何很大的浮点大数加一个很小的数计算结果不是预期的相关文章

android手机安装包很大安装后的软件却变小了

<p> 曾经认识一位老人,她的丈夫去世后,远在外地的儿女请她与儿孙们同住,她善意地拒绝了.她说,一个,人生活在这座城市里,独居在这个曾经充满着欢声笑语的小院里,感觉很平静,那日夜流淌的沙河水,那古朴的老榆树,那古老的街道,都能勾起对老伴和童年的回忆当你阅读这文章的时候,你心中是不是也有这样一个疑惑:男女生之间会有纯友:谊吗? 我坚信.那纯友谊.日久生情的故事无处不在,但只要把握好度,我相信会有真正的纯友谊. 有种友情不低于爱情, 是那种比朋友多一点,比情人少一点的关系.友情是每个人都有权 &l

常见的编程问题(一)少大数加减

存储区的概念 常见的存储区域可分为: 栈 由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收. 由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来释放分配的内存. 全局/静态存储区 全局变量和静态变量被分配到同一块内存中,在

记录一个python里面很神奇的操作,对一个包含列表的元组进行增量赋值,成功赋值但还报错

记录一个python里面很神奇的操作 今天记录一个很神奇的操作.关于序列的增量赋值.如果你很熟悉增量赋值,你也不妨看下去,我想说的是有关于增量赋值和元组之间一种神奇的操作.来自 <流畅的Python> 一书,让我们更加深入地了解里面的原理 神奇的操作 >>>t = (1,2,[30,40]) >>>t[2] += [50,60] 上面这段代码会出现什么样的情况 a. t会变成(1,2,[30,40,50,60]) b. 因为tuple不支持对它的元素赋值,所

在写论文的参考文献时,有的段落空格很大,有的段落则正常,原因及解决方法(wps)

下图是一段原始的参考文献,可以看出第一行的空格很大: 原因: 当一个词占不下时,自动将单词移动到下一行,但是这一行又有很多字符,因此这时,软件会将空闲的位置用空白字符填满.第一行有两个空白字符,因此将剩余空间平均分配. 解决方法: 首先选中段落,然后单击右键,选择段落 然后选择换行与分页,勾选 允许西文在单词中间换行. 如下图: 结果如图: 原文地址:https://www.cnblogs.com/zijidefengge/p/12117338.html

正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种:

1 2 3 4 5 6 7 //方法1   UIImage *imag1 = [UIImage imageNamed:@"image.png"];   //方法2   UIImage *image2 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image.png" ofType:nil]];   //方法3   NSData *imageData = [NSD

并查集详解(转自一个很有才的大神)膜拜

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修

《日常神经科学》神经科学的很大一个目标,就是让文艺和浪漫的事,变得不文艺不浪漫(因为给出了人感觉到文艺和浪漫的科学的解释)。三星推荐

不错的神经科学的科普.作者是英国神经科学在读博士.文笔比较幽默.大部分的内容都说的比较有趣. 以下是书中一些内容的摘抄: 神经科学的很大一个目标,就是让文艺和浪漫的事,变得不文艺不浪漫(因为给出了人感觉到文艺和浪漫的科学的解释): 这是谎言:正常人的大脑只开发了10%: 一条裙子的颜色(白金.蓝黑)引发的全球口水战,原因在于:对于所见之物,我们每时每刻都在脑补: 人的听力随年龄增长逐渐下降.到了35岁,已经明显听不到许多高频声音了.有个英国大叔讨厌在他家门口玩的小孩,就做了一个会发出高频声音的音

关于android中gridview数据量很大的时候,在加载gridview时会出现卡顿的现象

好的解决办法就是先加载一定数量的数据,然后在最下方提示正在加载! 动态加载就是把放入adapter中的数据分好几次加载.在用户拖动gridview时再加载一定的数据,和sina微博的客户端类似. 给gridview添加OnScrollListener监听事件默认会覆盖下面两个方法: 下面列举个列子: <com.ui.widget.LazyGridView xmlns:android="http://schemas.android.com/apk/res/android" andr

给定一个输入数据流,这个输入流很大,你不能将他们完全放在内存中。如何才能从这个输入流中随机的选取1000个数?

给定一个输入数据流,这个输入流很大,你不能将他们完全放在内存中.如何才能从这个输入流中随机的选取1000个数?