根本理解计算机中的财务 小数点误差 处理为什么有误差

误差与有效数字
§1.2 数值计算的误差
用数值方法解决科学研究或工程技术中的实际问题,一般来说,产生误差是不可避免的,根本不存在绝对的严格和精确。但是我们可以认识误差,从而控制误差,使之局限于最小(或尽量小)的范围内。
算法的实现必须在计算机上进行,计算机并不是像一般人想象的哪样可以解决一切问题而不出差错。半个世纪以来计算机带给我们这个世界的诸多烦恼中,误差问题最为突出。小到银行利率的错算,大到导弹的错误发射,除了操作人员的疏忽、机器的故障引起过失误差外,计算机在处理数据过程中还存在计算误差。这主要是计算机机器数所引起的,机器数的特点是有限、离散;这和数学上常用的实数系无限、稠密、连续的特点完全不同。
在2400多年前,古希腊人提出了被称为几何三大问题的古典难题。这说明在历史上,人类就常被误差所困扰。下面问题就是三大难题之一。
立方倍积问题 做一个立方体,使其体积为已知立方体的二倍。
解 不妨设已知立方体体积为1,要做的立方体体积为2,则所做立方体高度应该为。用计算机计算出≈1.259 921 049 894 87(15位数),尽管精确度相当高,但仍然是近似值。下面表中列出了对h取前有限位数时,计算所得体积的误差。
由上表可知,计算机机器数的有限位特点使这一问题只能在满足一定的精度条件下解决。误差是无法消除的。
1.2.1 计算机的数系与运算特点
计算机数系
我们所研究的算法都是在计算机上求解的方法,因此应该了解计算机是如何进行数字计算的,这有助于构造和分析各种数值方法。数字运算主要是实数运算,而任一实数都可以表示为
其中 为整数,x称为十进制浮点数。一般地,可定义进制浮点数为
在计算机中,由于机器本身的限制,一般实数只能被表示为
其中 这里的t是正整数,是计算机的字长,c为整数,满足和为固定整数,对不同的计算机,是不同的。这样的是x称为t位进制浮点数,其中c称为阶码,称为尾数,数集
称为机器数系,它是计算机进行实数运算所用的数系,一般取2,8,10和16.机器数系F是一个离散的有限集合,分布也不均匀。在F中有一个最大正数M和一个最小正数m,如数系中,, 若一个实数的绝对值大于M,则计算机产生上溢错误,若绝对值小于m,则计算机产生下溢错误,上溢时计算机中断程序处理;下溢时,计算机将此树以零表示,继续执行程序。上溢、下溢统称为溢出错误。通常,计算机把尾数为0且阶数最小的数表示为数零。
&&& 2. 计算机对数的接收
设实数x是计算机接收的数,则计算机对其的处理方法是:
,则计算机按原样接收x;
,但,则计算机用数系F中最接近x的数表示并记录x。
3. 计算机对数的处理
计算机对接收到数主要做加减乘除四则运算,其运算方式是:
是计算机接收到的二数。则此二数做加法的处理过程是:
计算机接收和处理实数的上述特点,往往使得数学上完美的公式在计算机上编程计算时却得不到正确的结果,所以在数值计算的研究中应注意计算机的此种特点。
在计算机数系中,把尾数第一位的数称为规格化浮点数,用规格化浮点数表示一个实数,具有形式唯一和精度高的特点,但并不是中所有数都能用规格化浮点数表示,如就不能用规格化浮点数表示。
1.2.2 误差的来源与分类
在数值计算过程中,估计计算结果的精确度是十分重要的工作,而影响精确度的因素是各种各样的误差,它们可分为两大类:一类称为“过失误差”,即因为疏忽导致误写数字和误用公式等,它一般是由人为造成的,这是可以避免的,故在“数值计算”中我们不讨论它;而另一类称为“非过失误差”,这在“数值计算”中往往是无法避免的,也是我们要研究的,大体有四种类型:模型误差、测量误差、截断误差和舍入误差。例如,计算地球的表面积可以用近似公式:。这其中就包含了各种误差。
1 模型误差
用数值计算方法解决实际问题时,首先必须建立数学模型。由于实际问题的复杂性,在对实际问题进行抽象与简化时,往往为了抓住主要因素而忽略了一些次要因素,这样就会使得建立起来的数学模型只是复杂客观现象的一种近似描述,它与实际问题之间总会存在一定的误差。我们把数学模型与实际问题之间出现的这种误差称为模型误差。在上面的近似公式中,把地球表面近似地看成一个球,这就是地球的简单模型,它与地球的实际情况有很大的差别。
2 测量误差
在数学模型中往往包含一些由观测或实验得来的物理量,如电阻、电压、温度、长度等,由于测量工具精度和测量手段的限制,它们与实际量大小之间必然存在误差,这种误差称为测量误差。上面近似公式中地球半径是要经过测量得到,然而无论使用什么工具,其误差是无法避免的。
3 截断误差
由实际问题建立起来的数学模型,在很多情况下要得到准确解是困难的,通常要用数值方法求出它的近似解。例如常用有限过程逼近无限过程,用能计算的问题代替不能计算的问题。这种数学模型的精确解与由数值方法求出的近似解之间的误差称为截断误差,由于截断误差是数值计算方法固有的,故又称为方法误差。例如用函数的泰勒(Taylor)展开式的部分和去近似代替,其余项就是真值的截断误差。如&&
当很小时,可以取前两项来近似代替的计算,即: ,由泰勒定理可知,这时与的误差是:
在计算中被抛弃了。截断误差的大小,直接影响数值计算的精度,所以它是数值计算中必须十分重视的一类误差。
4 舍入误差
无论用计算机、计算器计算还是笔算,都只能用有限位小数来代替无穷小数或用位数较少的小数来代替位数较多的有限小数。在上面的近似公式中的,因为是一个无理数,在计算机中无法精确表示,只能取有限位,一般取3.14159,而将后面无穷多位舍弃。不仅无理数,即便是十分简单的有理数如1/3,也只能用有限位的计算机数近似地表示为0.333333(保留6位)。因此在用计算机进行数值计算时,由于计算机的位数有限,在数值计算时只能近似地表示这些数字,由此而产生的误差称为舍入误差。
舍入地方法比较多,有收尾法(只入不舍)、去尾法(只舍不入)和四舍五入法等,一般常用人们所熟知的四舍五入法。
当然在计算过程中,这类误差往往是有舍有入的,而且单从一次的舍入误差来看也许是微不足道的,但应当注意的是,在数值计算中,当计算机上完成了千百万次运算之后,舍入误差的积累却可能是十分惊人的,这些误差一经迭加或传递,对精度可能有较大的影响。所以,在做数值计算时,对舍入误差应予以足够的重视。
综上所述,数值计算中除了可以完全避免的过失误差外,还存在难以回避的模型误差、观测误差、截断误差和舍入误差。显然,四类误差都会影响计算结果的准确性,而在这四种误差来源的分析中,前两种误差是客观存在的,称为固有误差,而固有误差往往是计算工作者不能独立解决的,是需要与各有关学科的科学工作者共同研究的问题;后两种误差是由计算方法所引起的,称为计算误差,计算误差将是数值计算方法的主要研究对象。因此,在本课程中,主要研究截断误差和舍入误差(包括初始数据的误差)对计算结果的影响,讨论它们在计算过程中的传播和对计算结果的影响,并找出误差的界,对研究误差的渐近特性和改进算法的近似程度具有重大的实际意义。
1.2.3 绝对误差与相对误差
在不同的场合下,表示近似数精确度的方法各有不同,下面介绍数值运算中误差的基本概念。
是精确值*的近似值,则称:E()=*-为近似值的绝对误差,简称误差。
应当注意的是,绝对误差E()不是误差的绝对值,它是可正可负的,当E() >0时,称为“弱近似值”或“亏近似值”,当E()<0时,称为“强近似值”或“盈近似值”。而误差的绝对值是一个非负值,它的大小标志着的精确程度,越小说明的精确程度越高。
一般来说,精确值*是不知道的,因而E()也就无法求出。但在实际测量中,可以根据具体情况估计出的某个上界,即存在一个适当的正数,使得:=
此时,称为近似值的绝对误差限,简称误差限或精度。有了绝对误差限就可以知道*范围为:-≤*≤x+
即*落在区间内。在工程应用上,常常采用*=±来表示近似值的精度或精确值*的所在范围。
绝对误差是有量纲的。例如,用毫米刻度的直尺去测量一个长度为*的物体,测得其近似值为=15mm,由于直尺以毫米为刻度,所以其误差不超过0.5mm,即:(mm)。这样,虽然不能得出准确值*的长度是多少,但从这个不等式可以知道*的范围是:14.5mm<*<15.5mm,说明*必在区间[14.5,15.5]内。
2 相对误差与相对误差限
用绝对误差来刻画一个近似值的精确程度是有局限性的,在很多场合中它无法显示出近似值的准确程度。如测量100m和10m两个长度,若它们的绝对误差限都是1m,显然前者的测量结果比后者的准确。由此可见,决定一个量的近似值的精确度,除了要看绝对误差的大小外,还必须考虑该量本身的大小,为此引入相对误差的概念。
定义1.2.2:设x*是准确值,x是近似值,将绝对误差与精确值之比,称为近似值的相对误差,即:=
由于精确值*一般无法知道,因此往往取=作为近似值
的相对误差。
类似于绝对误差的情况,若存在正数,使得:
则称为近似值的相对误差限。相对误差是无量纲的数,通常用百分比表示,称为百分误差。
例1.2.1:月球到地球的平均距离D=384401±0.5(km);某一公共汽车站到下一站的距离d=1.5±0.3(km)。则D的绝对误差限是0.5(km);d的绝对误差限是0.3(km),
根据绝对误差限的概念,第一个数据D的精确度比第二个数据d的精确度差,但由于,
根据相对误差限的概念,第一个数据D的精确度比第二个数据d的精确度高,这个结果比较合理,与人们的常识一致。所以,在分析误差时,相对误差更能刻画误差的特性。
1.2.4 有效数字
为了能给出一种数的表示法,使之既能表示其大小,又能表示其精确程度,于是需要引进有效数字的概念。在实际计算中,当准确值*有很多位数时,我们常按四舍五入的原则得到*的近似值。
例1.2.2: 我们知道e=2.…是一个无理数,由于无理数不能用有限位数表示,只能按四舍五入原则取其近似值:
取一位数时=3,  有
取三位数时=2.72, 有
取五位数时=2.7183,有
由以上分析可知,按四舍五入原则不管取几位小数得到的近似值,其绝对误差都不超过末位数的半个单位。
下面我们将四舍五入抽象为数学语言,进而引进“有效数字”的概念。
定义1.2.3:若是准确数* 的近似数,且,那么我们就说,用近似数表示*时,准确到非零数之间的一切数字都叫做有效数字,并把有效数字的位数叫做有效数位,它反映了近似*的精确程度。
也可用文字叙述如下:若近似值的绝对误差限是某一位的半个单位,就称“准确”到这一位,且从该位到的第一位非零数字共有n位,则称近似值有n位有效数字,或者说精确到该位。实际上,用四舍五入方法取得准确数*的前n位(不包括第一位非零数字前面的零)数,作为它的近似数时,就有n位有效数字,其中每一个数字(包括后面的零)都叫做的有效数字。
引入有效数字概念后,我们规定所写出的数都应该是有效数字,且在同一计算问题中,参加运算的数,都应该有相同的有效数字。在上面的例子中,有1位有效数字,具有3位有效数字,而具有5位有效数字。分别具有6,5位有效数字。
如何描述有效数字?(一般情况下在计算机中数往往规格化,故有必要考察规格化数。)一般地,任何一个精确值*经四舍五入后,所得到的近似值都可写成十进制浮点数表示形式:=±。其中,且都是0~9中的任一整数,称为尾数。用于确定小数点位置,指数m称为阶码。因此,一个浮点数包含尾数和阶码两部分。
当的绝对误差满足:=时,则称近似值具有n位有效数字。可以证明有效数字的两种定义方式是等价的。
在例1.2.2中=3=0.3×10,有×10(1-1),所以有1位有效数字,或者说精确到个位;=2.72=0.272×10, 有=0.5×10(1-3),则具有3位有效数字,或者说精确到0.01,=2.7183=0.27183×10,有=0.5×10(1-5),则具有5位有效数字,或者说精确到0.0001。
由此可见,如果用浮点数表示某个数据的近似值时,当阶码m一定时,有效数字位数n越多,其绝对误差越小。
有效数字不但给出了近似值的大小,而且还给出了它的绝对误差限。例如有效数字15.28,0.283×10-2,0.2830×10-2的绝对误差限分别为:0.5×10-2,0.5×10-5,0.5×10-6。
必须注意,在有效数字的记法中有效数字尾部的零不能随意省去,以免损失精度。例如,对于一个精确值*=3.(吨),其两个近似值=3.515(吨) 与=3.515000(吨)的近似程度是完全不同的,精确到0.001(精确到公斤),有四位有效数字,而精确到0.000001(精确到克),有七位有效数字。
还需特别指出的是,一个准确数字的有效数字应当说有无穷多位,例如1/2=0.5不能说只有1位有效数字。
例:设,它的两个近似值和分别有3,4位有效数字。
有效数字与相对误差有如下关系:
定理1.2.1 若用浮点数表示的近似值具有n位有效数字,则其相对误差限为:。
证明 由=±。其中,且都是0~9中的任一整数,得:,所当有位有效数字时,,则:。
可见有效数字的位数越多,相对误差限就越小,即近似值的有效位数越多,用这个近似值去近似代替准确值的精度就越高。
例1.2.3:为了使近似值的相对误差小于1%,问至少取几位有效数字?
解 的近似值的首位非零数字是4,则有:
解之得n>2,故取n=3即可满足要求。也就是说只要的近似值具有3位有效数字,就能保证≈4.47的相对误差小于1%。
定理1.2.2若的相对误差限,则至少具有位有效数字。
若有相对误差限:,则:
因此至少有位有效数字,证毕。
有效数字的位数可以刻画近似数的精确度(有效数字的位数越多,绝对误差限和相对误差限就越小) 。绝对误差与小数后的位数有关,相对误差与有效数字的位数有关。
1.2.5 数值计算的误差估计
数值计算中误差产生与传播的情况非常复杂,参与运算的数据往往都是些近似值,它们都带有误差。而这些数据的误差在多次运算中又会进行传播,使计算结果产生一定的误差,这就是误差的传播问题。
以下介绍利用函数的Taylor公式来估计误差的一种常用方法。
设二元可微函数中的自变量*1,*2相互独立,又1,2是自变量*1,*2的近似值,则的近似值。
将函数在点(1,2)处作泰勒展开,并略去其中的高阶无穷小项,即可得到y*的近似值y的绝对误差的估计式为:
&&&&&&&&&&&&&&&&
         =
其中两个偏导数应该是在点(1,2)处的值。
近似值y的相对误差的估计式为:
         =
以上式子中的及分别为各个对的绝对误差和相对误差的增长因子,分别表示绝对误差和相对误差经过传播后增大或缩小的倍数。
由以上两个公式,很容易导出两个近似值和与差的绝对误差和相对误差的估计式:
对于绝对误差有:。即和与差的绝对误差不大于各绝对误差之和。
对于相对误差,考虑最坏的情况是所有相对误差同号,当时,可得:
即和的相对误差不超过各单项中的最大相对误差。
  同理可得两个近似值之积、商绝对误差和相对误差的估计式:
近似值x的绝对误差和相对误差的估计式,也可用微分的形式近似表示。绝对误差,相对误差。并有如下结论:
1 和的绝对误差:d(x+y)=dx+dy。因此,和的绝对误差限(x+y)≤x+y。
2 和的相对误差:
对相对误差可作一些讨论:
⑴ 当xy<0时,必有:或
这时对于很小的相对误差dlnx或dlny可能导致很大的相对误差dln(x+y),特别是x+y≈0时,可能使dln(x+y)相当大,因此在近似计算中应当努力避免相近的两个数相减,避免小的数作分母,这是减小误差的一个原则。
为此在x接近于零时,常作变换:
当x充分大时,常作变换:
⑵ 当xy>0时,必有:或,则:
即和的相对误差不超过相对误差之和进而有:(x+y)≤x+y。
同时还可推出:
因此,表明同号两数和的相对误差(限)不超过这两数相对误差(限)的最大者。
特别地,当时,,则:。
因此,当同号二数的绝对值相差很大时,其和的相对误差约等于绝对值大者的相对误差。
3 积的绝对误差 d(xy)=xdy+ydx,积的相对误差dln(xy)=dlnx+dlny。
特别地,dlnxn=ndlnx。
4 商的绝对误差:
&& 商的相对误差:
多个数值相乘除时,其相对误差等于各乘数和除数的相对误差的和与差,例:
对于多元函数,它的绝对误差:
它的相对误差:。
最后指出,在由误差估计式得出绝对误差限和相对误差限的估计时,由于取了绝对值并用三角不等式放大,因此是按最坏的情形得出的,所以由此得出的结果是保守的。事实上,出现最坏情形的可能性是很小的。因此近年来出现了一系列关于误差的概率估计。一般来说,为了保证运算结果的精确度,只要根据运算量的大小,比结果中所要求的有效数字的位数多取1位或2位进行计算就可以了。
1.2.6 算法的数值稳定性
所谓算法,不仅是单纯的数学公式,而是对一些已知数据按某种规定的顺序进行有限次四则运算,求出所关心的未知量的整个计算过程。解决一个计算问题往往有多种算法,其计算结果的精度往往大不相同。原因是初始数据的误差或计算中的舍入误差在计算过程中的传播,因算法不同而相异。一个算法如果输入数据有误差,而在计算过程中舍人误差不增长,则称此算法是数值稳定的,否则,称此算法为不稳定的。
在构造算法时,应构造数值稳定的,尽量避免误差的危害。算法数值稳定通常有以下几条原则:
1)要防止“大数吃小数”。在数值计算中,参加运算的数有时数量级相差很大,而计算机的字长有限,加减法在向上对阶、运算,再四舍五入时,小数被吃掉。故在多数做和时,可将同号数按从小到大的顺序来计算。
2)要避免二相近的数相减。两个相近数相减会引起有效数字的严重损失,从而导致相对误差的增大。要避免这种情况,通常可采用数学方法将相应的计算公式转化为另一个等价的计算公式来计算。例如,x充分大时,计算
时,与很接近,直接计算会造成有效数字的严重损失,可将原式化为一个等价公式
来计算,以减少误差。
3)要避免绝对值很小的数作除数。绝对值很小的数作除数会直接影响计算结果的精度,这是由
可见,当|y|充分小时,可能会变得很大。避免这种情况的方法,往往可用化其为其他等价形式来处理,例如,当x接近于0,将转化为等价式来计算,可避免这种情况发生。
4)要减少运算次数,避免误差积累。减少运算次数,能减少舍入误差及其传播环节。如对多项式
的计算,直接计算需做次乘法,而采用秦九绍算法,只需进行n次乘法。
5)要控制舍入误差的积累和传播。如一定积分递推公式,初值的舍入误差在计算过程中迅速传播,而用逆推公式,则成为数值稳定的算法。beckle在如鹏论坛上提问:#include&stdio.h&int main(){int a=12;float b=702.1;printf("%e,%d,/n",a,a);printf("%e,%f,/n",b,b);}我在最近发现,这里面的输出都有问题。。如上面代码所示,应该输出的是12(指数类型),12702.1(指数类型),702.10000但结果确实这样 :2.3,41991897.2,702,099976==================================================================首先看printf("%e,%d,/n",a,a);这行代码,&%e&表示以指数方式输出浮点数,所以printf函数就认为你输入的数字float类型,不幸的是你的这里给的是int类型的a,因为printf函数就被骗了,所以输出了乱七八糟的数字,而且也殃及池鱼到了后边的&%d&。我们可以说printf有点傻,也可以说我们应该严格按照函数的约定来进行调用。千万不要因为认为&int就是一种float&,只是&int能够与float兼容&而已。int和float是不同的数据类型。你试着运行一下这句代码:printf("%e,%d,/n",(float)a,a);。看看是不是得到了你预想的效果?printf("%e,%f,/n",b,b);%e就是表示以指数的方式输出的,所以输出&***e***&是正确的。float输出误差现象这就涉及到数字在计算机中存储的问题了,这应该在C语言、计算机组成原理、数字电路等课程中不止一次的讲过。我们知道数字在计算机中是以二进制存储的。对于整数来说,只要不超过整数的表示范围,一定都可以表示成二进制的形式,比如8是100,9是101,88是1011000,可是小数小数部分就没有那么幸运了,根据二进制转换成十进制的规则(适当复习一下:把该小数不断乘2,再取所得的整数部份,直至没有小数为止)。由于二进制中所有的小数存储的位数是有限,因此我们得知&任何十进制整数都可以精确转换成一个二进制整数,但任何十进制小数却不一定能精确转换成一个二进制小数,只要转换过程中乘积的小数部分满足所需精度即可&。比如对于0.1来说就不能精确转换为一个二进制小数,在16位小数的限制条件下,离它最近的二进制小数是0.1,也就是十进制的0.5。所以虽然你写程序的时候写的是0.1开始这个数存储到b这个float变量里的时候就变成了0.1,也就是0.5,因此你输出它的时候就会出现精度误差了,这种误差是不可避免的。当然你可以指定&%f&的精度,比如:float b=702.1;printf("%.1f",b);这时候就可以输出&702.1&了,但是这只是&恰巧输出正确而已&,因为&0.5&在转换为一位小数精度的时候&恰巧&能够四舍五入成0.1而已,并不是像我们想像的那样&解决误差问题&本文来自 & 如鹏网&学生提问交流实况
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 12:48收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1查看:921|回复:6
大家好!和大家讨论一个问题。给float类型变量赋值169.3,打印出来是169.300003,如果把变量和它自身加一次,打印结果是336.600006。如此的话如果计算的小数很多,产生的误差累加起来会越来越大。如何处理C语言中的小数误差呢?
版规,发帖可获2无忧币
那要看你项目对精度的要求
一般情况下这些误差不会有什么问题
引用:原帖由 向立天 于
10:10 发表
那要看你项目对精度的要求
一般情况下这些误差不会有什么问题 原来是这样,看来C本身确有此问题。多谢版主啦
版规,回帖可获2无忧币
引用:原帖由 大纲007 于
08:41 发表
原来是这样,看来C本身确有此问题。多谢版主啦 这不是语言的问题
误差是客观存在
从硬件的角度来说二机制只能表示0和1以及有他们衍生出来的整数
float数都是通过算法电路逼近出来的
引用:原帖由 一盘小菜菜 于
22:49 发表
實在不行,可以考慮用字符串來處理高精度的需求環境。 处理高精度数据我一般建议通过整数去算
不过咱俩说的环境可能不一样
我做过一个设备下位机传上来的数据都是整数
然后自己通过一个算法计算成浮点数
保存的时候我都是直接保存上传的整型数据
这样还比浮点数节省空间
引用:原帖由 向立天 于
10:19 发表
这不是语言的问题
误差是客观存在
从硬件的角度来说二机制只能表示0和1以及有他们衍生出来的整数
float数都是通过算法电路逼近出来的 太高深了!!对版主的话似懂非懂
版规,回帖可获2无忧币
助理工程师
引用:原帖由 向立天 于
10:23 发表
处理高精度数据我一般建议通过整数去算
不过咱俩说的环境可能不一样
我做过一个设备下位机传上来的数据都是整数
然后自己通过一个算法计算成浮点数
保存的时候我都是直接保存上传的整型数据
这样还比浮点数节省空间 ... 以前做下位机也是参照别人的程序先转换成整数来计算,原来是这么个意思
版规,回帖可获2无忧币也就是通常在十进制数中我们所说的个位数
时间: 21:36:03
&&&& &&&& &&&& &&&&&&&&二进制&&&&二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。&&&&&&&&由人民出版社出版的《童子问易》引证说:斯比赛尔所编著的《中国文史评析》一书中已将《易图》称之为“2的乘方,二进制。”“以中国《易图》为标志的二进制在欧洲最迟出现于1660年。”[1]&&&&&&&&安德烈·弥勒于1678年著《阿卜杜拉·白达瓦鲁斯中国史》。“莱布尼茨主要通过这本书了解了易学。他的二进制,主要来源于《易经》,其0、1符号取之埃哈德·魏格的0、1、2、3的四进制。”[2]&&&&&&&&中文名二进制外文名binarysystem&&&&&&&&目录&&&&1简介2运算&&&&?加法?乘法?减法?除法?拈加法&&&&&&&&3进制转换&&&&?与十进制?与八进制?与十六进制?与十进制的区别1&&&&&&&&&&&&4莱布尼茨&&&&?简述?与中国易经联系&&&&&&&&5特点&&&&?优点?缺点&&&&&&&&6采用原因7学科关系8处理数据9换算&&&&&&&&1简介编辑&&&&20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号0.1的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。二进制数据的表示法二进制数据也是采用位置计数法,其位权是以2为底的幂。例如二进制数据110.11,逢2进1,其权的大小顺序为2?、2?、2?、&&&&&&&&、&&&&&&&&。对于有n位整数,m位小数的二进制数据用加权系数展开式表示,可写为:&&&&&&&&二进制数据一般可写为:&&&&&&&&【例1102】将二进制数据111.01写成加权系数的形式。&&&&&&&&2&&&&&&&&&&&&解:&&&&&&&&二进制和十六进制,八进制一样,都以二的幂来进位的。&&&&&&&&2运算编辑&&&&二进制数据的算术运算的基本规律和十进制数的运算十分相似。最常用的是加法运算和乘法运算。&&&&&&&&加法&&&&有四种情况:0+0=00+1=11+0=11+1=100进位为1【例1103】求1011(2)+11(2)的和解:&&&&&&&&]&&&&&&&&乘法&&&&有四种情况:0×0=0&&&&3&&&&&&&&&&&&1×0=00×1=01×1=1&&&&&&&&减法&&&&0-0=0,1-0=1,1-1=0,0-1=1。&&&&&&&&除法&&&&0÷1=0,1÷1=1。&&&&&&&&拈加法&&&&拈加法二进制是加减乘除外的一种特殊算法。拈加法运算与进行加法类似,但不需要做进位。此算法在博弈论(GameTheory)中被广泛利用计算机中的十进制小数转换二进制计算机中的十进制小数用二进制通常是用乘二取整法来获得的。比如0.65换算成二进制就是:0.65×2=1.3取1,留下0.3继续乘二取整0.3×2=0.6取0,留下0.6继续乘二取整&&&&&&&&4&&&&&&&&&&&&0.6×2=1.2取1,留下0.2继续乘二取整0.2×2=0.4取0,留下0.4继续乘二取整0.4×2=0.8取0,留下0.8继续乘二取整0.8×2=1.6取1,留下0.6继续乘二取整0.6×2=1.2取1,留下0.2继续乘二取整.......一直循环,直到达到精度限制才停止(所以,计算机保存的小数一般会有误差,所以在编程中,要想比较两个小数是否相等,只能比较某个精度范围内是否相等。)。这时,十进制的0.65,用二进制就可以表示为:0.1010011。还值得一提的是,在计算机中,除了十进制是有符号的外,其他如二进制、八进制、16进制都是无符号的。在现实生活和记数器中,如果表示数的“器件”只有两种状态,如电灯的“亮”与“灭”,开关的“开”与“关”。一种状态表示数码0,另一种状态表示数码1,1加1应该等于2,因为没有数码2,只能向上一个数位进一,就是采用“满二进一”的原则,这和十进制是采用“满十进一”原则完全相同。1+1=10,10+1=11,11+1=100,100+1=101,101+1=110,110+1=111,111+1=1000,,可见二进制的10表示二,100表示四,1000表示八,10000表示十六,。二进制同样是“位值制”。同一个数码1,在不同数位上表示的数值是不同的。如11111,从右往左数,第一位的1就是一,第二位的1表示二,第三位的1表示四,第四位的1表示八,第五位的1表示十六。所谓二进制,也就是计算机运算时用的一种算法。二进制只由一和零组成。比方说吧,你上一年级时一定听说过“进位筒”(“数位筒”)吧!十进制是个位上满十根小棒就捆成一捆,放进十位筒,十位筒满十捆就捆成一大捆,放进百位筒二进制也是一样的道理,个位筒上满2根就向十位进一,十位上满两根就向百位进一,百位上满两根二进制是世界上第一台计算机上用的算法,最古老的计算机里有一个个灯泡,当运算的时候,比如要表达“一”,第一个灯泡会亮起来。要表达“二”,则第一个灯泡熄灭,第二个灯泡就会亮起来。&&&&&&&&5&&&&&&&&&&&&二进制就是等于2时就要进位。0=01010即是逢二进一,二进制广泛用于最基础的运算方式,计算机的运行计算基础就是基于二进制来运行。只是用二进制执行运算,用其他进制表现出来。其实把二进制三位一组分开就是八进制,四位一组就是十六进制&&&&&&&&3进制转换编辑&&&&&&&&6&&&&&&&&&&&&十进制数转换为二进制数、八进制数、十六进制数的方法:二进制数、八进制数、十六进制数转换为十进制数的方法:按权展开求和法&&&&&&&&与十进制&&&&(1)二进制转十进制方法:“按权展开求和”【例】:&&&&&&&&规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依次递增,而十分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。注意:不是任何一个十进制小数都能转换成有限位的二进制数。(2)十进制转二进制·十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)【例】:&&&&&&&&89÷÷÷212÷201·十进制小数转二进制数:“乘以2取整,顺序排列”(乘2取整法)【例】:(0.625)10=(0.101)2&&&&7&&&&&&&&&&&&0.625X2=1.=0.=1.001十进制1至100的二进制表示:0=01=12=103=114=07==011=013=015==11&&&&8&&&&&&&&&&&&20=====35=38=41=&&&&9&&&&&&&&&&&&44=47=50=53=56=59=62=065=0011&&&&10&&&&&&&&&&&&68=1011&&&&11&&&&&&&&&&&&92=0011&&&&12&&&&&&&&&&&&116=============&&&&&&&&与八进制&&&&二进制数转换成八进制数:从小数点开始,整数部分向左、小数部分向右,每3位为一组用一位八进制数的数字表示,不足3位的要用“0”补足3位,就得到一个八进制数。八进制数转换成二进制数:把每一个八进制数转换成3位的二进制数,就得到一个二进制数。八进制数字与二进制数字对应关系如下:000-0|100----7【例】:将八进制的37.416转换成二进制数:&&&&13&&&&&&&&&&&&37..即:(37.416)8=(11)2【例】:将二进制的转换成八进制:10026.14即:()2=(26.14)8&&&&&&&&与十六进制&&&&二进制数转换成十六进制数:二进制数转换成十六进制数时,只要从小数点位置开始,向左或向右每四位二进制划分一组(不足四位数可补0),然后写出每一组二进制数所对应的十六进制数码即可。十六进制数转换成二进制数:把每一个十六进制数转换成4位的二进制数,就得到一个二进制数。十六进制数字与二进制数字的对应关系如下:--C--D-6-E-7-F【例】:将十六进制数5DF.9转换成二进制:5DF.1.1001即:(5DF.9)16=(.1001)2{十六进制怎么会有小数点}【例】:将二进制数转换成十六进制:10&&&&&&&&14&&&&&&&&&&&&61.E即:()2=(61.E)16&&&&&&&&与十进制的区别&nbs&&&&p;&&&二进制与十进制的区别在于数码的个数和进位规律有很大的区别,顾名思义,二进制的计数规律为逢二进一,是以2为基数的计数体制。10这个数在二进制和十进制中所表示的意义完全不同,在十进制中就是我们通常所说的十,在二进制中,其中的一个意义可能是表示一个大小等价于十进制数2的数值。仿照例题1.3.1,我们可以将二进制数10表示为:10=1×2^1+0×2^0&&&&&&&&十进制与二进制的关系&&&&&&&&一般地,任意二进制数可表示为:例题1.3.2试将二进制数()B转换为十进制数。解:将每一位二进制数乘以位权后相加便得相应的十进制数在数字电子技术和计算机应用中,二值数据常用数字波形来表示。使用数字波形可以使得数据比较直观,也便于使用电子示波器进行监视。图1.3.3表示一计数器的波形。图1.3.3用二进制数表示0~15波形图图中给出了四个二进制波形。看这种二进制波形图时,我们应当沿着图中虚线所示的方向来看,即使图中没有标出虚线(一般都没有标出),也要想象出虚线来。其中在每一个波形上方的数字表示了与波形对应的位的数值,最后一行则是相应的十进制数,其中LSB是英文LeastSignificantBit的缩写,表示最低位,MSB是MostSignificantBit的缩写,表示二进制数的最高位。显然,这是一组4位的二进制数,总共有16组,最左边的二进制数为0000,最上边的波形代表二进制数的最低位,也就是通常在十进制数中我们所说的个位数,最下面&&&&15&&&&&&&&&&&&的是最高位。图中最右边的二进制数为1111,对应的十进制数为15。再来看看对应于十进制数5的二进制数是多少呢?是0101,对了,读数的顺序是从下往上。二进制数在数字系统(比如计算机之间)中的传输的方式分为串行和并行两种。其中串行传输时二进制数是按照逐位传递的方式进行传输,根据实际情况可以从最高位或最低位开始传输,一般情况下是从最高位开始传输的。只需要一根数据线。如图1.3.4所示,要完成八位二进制数的传输,需要经历八个时钟周期。图1.3.4二进制数据的串行传输(a)两台计算机之间的串行通信(b)二进制数据的串行表示典型的例子是调制解调器与计算机之间的通信就是通过串行传输来完成的。并行传输的效率要高于串行传输,一次可以传输完整的一组二进制数。但是根据所要传输的二进制数的位数的多少,需要备足足够多的数据线。一般来说,常见的并行传输采用的数据线有8、16、32等,再多就很少见了。典型的并行传输例子是打印机与计算机之间的通信传输,见图1.3.5。图1.3.5并行传输数据的示意图(a)计算机与打印机之间的并行通信(b)二进制数据的并行表示图1.3.5显示了采用并行传输模式,只需要一个时钟周期,即可完成八位二进制数的传输。&&&&&&&&4莱布尼茨编辑&&&&&&&&简述&&&&在德国图灵根著名的郭塔王宫图书馆(SchlossbiliothkezuGotha)保存着&&&&&&&&16&&&&&&&&&&&&用ftp工具以二进制方式上传&&&&&&&&一份弥足珍贵的手稿,其标题为:“1与0,一切数字的神奇渊源。这是造物的秘密美妙的典范,因为,一切无非都来自上帝。”这是德国天才大师莱布尼茨(GottfriedWilhelmLeibniz,)的手迹。但是,关于这个神奇美妙的数字系统,莱布尼茨只有几页异常精炼的描述。莱布尼茨不仅发明了二进制,而且赋予了它宗教的内涵。他在写给当时在中国传教的法国耶稣士会牧师布维(JoachimBouvet,)的信中说:“第一天的伊始是1,也就是上帝。第二天的伊始是2,到了第七天,一切都有了。所以,这最后的一天也是最完美的。因为,此时世间的一切都已经被创造出来了。因此它被写作‘7’,也就是‘111’(二进制中的111等于十进制的7),而且不包含0。只有当我们仅仅用0和1来表达这个数字时,才能理解,为什么第七天才最完美,为什么7是神圣的数字。特别值得注意的是它(第七天)的特征(写作二进制的111)与三位一体的关联。”布维是一位汉学大师,他对中国的介绍是17、18世纪欧洲学界中国热最重要的原因之一。布维是莱布尼茨的好朋友,一直与他保持着频繁的书信往来。莱布尼茨曾将很多布维的文章翻译成德文,发表刊行。恰恰是布维向莱布尼茨介绍了《周易》和八卦的系统,并说明了《周易》在中国文化中的权威地位。八卦是由八个符号组构成的占卜系统,而这些符号分为连续的与间断的横线两种。这两个后来被称为“阴”、“阳”的符号,在莱布尼茨眼中,就是他的二进制的中国翻版,但实际莱布尼茨是受中国阴阳太极影响,只不过他付出了诸多研究,推演出二进制。他感到这个来自古老中国文化的符号系统与他的二进制之间的关系实在太明显了,因此断言:二进制乃是具有世界普遍性的、最完美的逻辑语言。另一个可能引起莱布尼茨对八卦的兴趣的人是坦泽尔(WilhelmErnstTentzel),他当时是图灵根大公爵硬币珍藏室的领导,也是莱布尼茨的好友之一。在他主管的这个硬币珍藏中有一枚印有八卦符号的硬币。&&&&&&&&与中国易经联系&&&&日戈特弗里德·威廉·莱布尼茨发明了一种计算法,用两位数代替原来的十位数,即&&&&&&&&17&&&&&&&&&&&&1和0。1701年他写信给在北京的神父Grimaldi(中文名字闵明我)和Bouvet(中文名字白晋)告知自己的新发明,希望能引起他心目中的“算术爱好者”康熙皇帝的兴趣。白晋很惊讶,因为他发现这种“二进制的算术”与中国古代的一种建立在两个符号基础上的符号系统是非常近似的,这两个符号分别由一条直线和两条短线组成,即——和——。这是中国最著名大概也是最古老的书《易经》的基本组成部分,据今人推测,该书大约产生于公元前第一个千年的初期,开始主要是一部占卜用书,里边的两个符号可能分别代表“是”和“不”。莱布尼茨对这个相似也很吃惊,和他的笔友白晋一样,他也深信《易经》在数学上的意义。他相信古代的中国人已经掌握了二进制并在科学方面远远超过当代的中国人。《易经》不是数学书,而是一本“预言”,并在漫长的历史中逐渐演变为一本“智慧之书”。书里的短线意味着阴阳相对,也即天与地、光明与黑暗、造物主和大自然。六爻以不同的组合出现,人们可以借此对自然界和人类生活的变换做出各种不同的解释。比利时神父P.Couplet(中文名字柏应理)的Confucius.SinarumPhilosophus(《孔子,中国人的思想家,?》)第一次在欧洲发表了易经的六十四幅六爻八卦图。这一次将数学与古代中国《易经》相联的尝试是不符合实际的。莱布尼茨的二进制数学指向的不是古代中国,而是未来。莱布尼茨在日记录下他的二进制体系的同时,还设计了一台可以完成数码计算的机器。我们今天的现代科技将此设想变为现实,这在莱布尼茨的时代是超乎人的想象能力的。&&&&&&&&5特点编辑&&&&&&&&优点&&&&&&&&18&&&&&&&&&&&&数字装置简单可靠,所用元件少;只有两个数码0和1,因此它的每一位数都可用任何具有两个不同稳定状态的元件来表示;基本运算规则简单,运算操作方便。&&&&&&&&缺点&&&&用二进制表示一个数时,位数多。因此实际使用中多采用送入数字系统前用十进制,送入机器后再转换成二进制数,让数字系统进行运算,运算结束后再将二进制转换为十进制供人们阅读。二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。我们也一样,只要学完这一小节,就能做到。首先我们来看一个二进制数:1111,它是多少呢?你可能还要这样计算:1×2?+1×2?+1×2?+1×2?=1×1+1×2+1×4+1×8=15。然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为2?=8,然后依次是2?=4,2?=2,2?=1。记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。下面列出四位二进制数xxxx所有可能的值(中间略过部分)仅4位的2进制数快速计算方法十进制值十六进值+2+1=15F+2+0=14E+0+1=13D+0+0=12C+2+1=11B+2+0=10A&&&&&&&&19&&&&&&&&&&&&+0+1=9....+0+1=+0+0=00二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。如(上行为二制数,下面为对应的十六进制):011011FD,A5,9B反过来,当我们看到FD时,如何迅速将它转换为二进制数呢?先转换F:看到F,我们需知道它是15(可能你还不熟悉A~F这六个数),然后15如何用8421凑呢?应该是8+4+2+1,所以四位全为1:1111。接着转换D:看到D,知道它是13,13如何用8421凑呢?应该是:8+4+1,即:1101。所以,FD转换为二进制数,为:由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。比如,十进制数1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:被除数计算过程商余数13(D)44/1604结果16进制为:0x4D2同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方&&&&20&&&&&&&&&&&&法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。&&&&&&&&6采用原因编辑&&&&(1)技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。(2)简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。(3)适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。(4)易于进行转换,二进制与十进制数易于互相转换。(5)用二进制表示数据具有抗干扰能力强,可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高还是低。&&&&&&&&7学科关系编辑&&&&二进制是一种非常古老的进位制,由于在现代被用于电子计算机中,而旧貌换新颜变得身价倍增起来。或许是出于证明我国古代人的伟大智慧这样的好心吧,许多人从我国伟大而神秘的《周易》中发现了二进制。当有人发现莱布尼兹曾将二进制与中国《周易》联系在一起时,就自认为找到了一个更为有力的证据。于是,一个神话就被泡制出来了。其大意是:莱布尼兹通过在中国的传教士,得到了八卦图,他领悟到只要把八卦中的阴爻代表0,阳爻代表1,就可以创立一种新的记数法:二进制。这一神话虽经部分数学史家之批驳,但至今仍广为传播。因而,我们有必要更详尽地对莱布尼兹、二进制与《周易》三者的关系做一澄清、说明的工作。[3]这种所谓的“澄清”、“说明”工作并没有被一些人的嘲讽而停顿。曾成功主持“新三论耗散结构理论奠基人诺奖获得者普利高津与中国周易研究会会长刘大均先生高峰学术会议的青年学者胡阳、李长铎本着严谨的科学精神,踏遍欧洲各大图书馆,经过锲而不舍地努力,终于找到了新证据:在比利时新鲁汶大学图书馆发现了斯比赛尔的《中国文史评注》,此书证明早在1660年德国神学家斯比赛尔(G.Spizel)就将中国的《易图》翻译为“2的乘方——二进制(binary),此书证明莱布尼茨发明二进制源于伏羲八卦图。最有力的证据是&&&&21&&&&&&&&&&&&在莱布尼茨图书馆找到了莱布尼茨1716年临终忏悔《致徳雷蒙先生的信——论中国的自然神教》,信中莱氏”诚实的说出他关于二进制的文章是受中国太极八卦图的启发的事实(参见胡阳、李长铎:《莱布尼茨二进制与伏羲八卦图考》p81,118-119页)。改革开放前,大多数中国人不知道计算机是什么东西。1980年,美国人第一台8086CPU芯片个人计算机(PC,俗称电脑)上市,80年代初,中国出现了进口电脑。一台苹果机,价格近两万元,是普通干部工人工资的数百倍,个人根本没有能力购买。90年代以后中国有了互联网,电脑才逐步为中国人所熟悉。&&&&&&&&8处理数据编辑&&&&我们在使用数据库时,有时会用到图像或其它一些二进制数据,这个时候你们就必须使用&&&&&&&&二进制循环编码盘&&&&&&&&getchunk这个方法来从表中获得二进制大对象,我们也可以使用AppendChunk来把数据插入到表中.我们平时来取数据是这样用的!Getdata=rs(fieldname)而取二进制就得这样size=rs(fieldname).acturalsizegetdata=rs(fieldname).getchunk(size)&&&&&&&&22&&&&&&&&&&&&我们从上面看到,我们取二进制数据必须先得到它的大小,然后再搞定它,这个好像是ASP中处理二进制数据的常用方法,我们在获取从客户端传来的所有数据时,也是用的这种方法。下面我们也来看看是怎样将二进制数据加入数据库rs(fieldname).appendchunkbinarydata一步搞定!另外,使用getchunk和appendchunk将数据一步一步的取出来!下面演示一个取数据的例子!Addsize=2totalsize=rs(fieldname).acturalsizeoffsize=0DoWhereoffsizeBinarydata=rs(fieldname).getchunk(offsize)data=dataBinarydataoffsize=offsize+addsizeLoop当这个程序运行完毕时,data就是我们取出的数据.&&&&&&&&9换算编辑&&&&从小数点开始3位(不足3位补0)二进制数得到1位八进制数(用B带表二进制,用O带表八进制):000B=0O、001B=1O、010B=2O、011B=3O、100B=4O、101B=5O、110B=6O。二进制与十进制的“1248换算法:例&&&&十进制二进制&&&&&&&&23&&&&&&&&&&&&即16+4+1+21简单来说,就是把二进制数代入表格内,十进制数不变,只要把有十进制中对应1的数加起来就可以得出结果。&&&&&&&&24&&&&&&&&&&&&&&&& &&&&

我要回帖

更多关于 相对误差保留几位小数 的文章

 

随机推荐