两个双精度浮点型变量变量相乘结果为什么不精确

sponsored links
浮点运算的不精确性能够产生的灾难
&& 浮点表示对形如V=x*2y的有理数进行编码近似地表示实数。当一个数字不能被准确表示时,必须向下或向上调整,由此产生了舍入(rounding)。IEEE浮点格式定义了四种不同的舍入方式,默认方法是找到最接近的匹配,而其他三种可用于计算上界和下界。&浮点运算的不精确性能够产生灾难性后果。例如美国在1991年海湾战争期间使用的爱国者导弹误伤事件,其系统含有一个内置时钟,实现为一个计时器,每0.1秒加1。程序用一个24位近似于1/10的二进制小数乘以此计数器的值,用于以秒为单位确定时间。正常地,一个通过一次读取时钟得到地绝对时间中地轻微错误不会影响计算,它应依赖于两次连续地读取之间地相对时间。而爱国者导弹软件已经升级成使用更精确地函数来读取时间,但不是所有地函数调用都用新的代码替换了。结果是,跟踪软件使用了一次读取的是精确的时间,但其他软件读取的是不精确的时间。&Intel&IA32计算或使用浮点数时用专用寄存器保存浮点值,它使用一种特殊的80位扩展精度格式,这样就比保存在存储器中的格式提供了更大的表示范围和更高的精度。对于程序员而言,把所有寄存器数据扩展成80位,并把所有存储器数据收缩成更小的格式,会产生一些后果,即在存储器中保存一个值,然后取出它就会由于舍入、下溢或上溢改变它的值。&例:&double&recip(int&denom)&{&&return&1.0/(double)&denom);&}&void&test1(int&denom)&{&&double&r1,&r2;&&int&t1,&t2;&&r1&=&recip(denom);&&r2&=&recip(denom);&&t1&=&r1&==&r2;&&do_nothing();&&t2&=&r1&==&r2;&&printf(“test1&t1:&r1&%f&%c&=&r2&%fn”,&r1,&t1&?’=’:’!’,&r2);&&printf(“test1&t2:&r1&%f&%c&=&r2&%fn”,&r1,&t1&?’=’:’!’,&r2);&当带优化选项”-o2”编译,并用参数10运行这个文件时,结果如下:&&test1&t1:&r1&0.100000&!=&r2&0.100000&&test1&t2:&r1&0.100000&==&r2&0.100000&变量r1和r2是由相同参数的相同函数计算的,且没有明显的隐藏的副作用,但得出结果却相反。原因是函数recip计算的数值返回结果到浮点寄存器中,无论何时过程test1调用某个函数,必须将浮点寄存器中的当前值存储到主程序栈中,这是存放函数局部变量的地方。执行这个存储的过程中,处理器将扩展精度寄存器值转换成双精度存贮器值。因此,在第二次调用recip之前,变量r1被转换并存储成双精度了。在第二次调用后,变量r2由函数返回的扩展精度值。在计算t1时,双精度r1与扩展精度数r2相比较。因0.1不能精确的被任何一种格式表示,所以测试结果是假,在调用函数do_nothing()之前,r2被转换并且存储成双精度数。在计算t2时,比较的是两个双精度数,得到结果为真。&这个示例证明了在IA32机器上编译器GCC的一个缺陷,由于对程序员来说不可见的运算,例如浮点寄存器的保存和恢复,变量的值发生了改变。以下是解决此问题的办法,如用命令行选项”-ffloat-store”来调用gcc,告诉其每一个浮点计算的结果在使用前都必须存储到存储器中,再读回来;或通过将所有的变量声明为long&double类型,而让gcc在所有的计算中都使用扩展精度。这两种解决方案缺陷是降低了程序的运行速度或增加了存储器消耗。&将大的浮点数转换成整数是一种常见的程序错误来源,如1996年Ariane5火箭首航事故,就是因为控制惯性导航系统的计算机向控制引擎的计算机发送了一个无效数据,即由于一个64位浮点数转换成16位有符号整数时产生了溢出,导致控制信息变成了一个诊断位模式。原因是设计者未经重新测试沿用了Ariane4的一个函数,当时考虑水平速率不会超出一个16位数,而新型火箭速率远远超出了前者。
[日期:]来源:
作者:[字体:大中小] 本方案主要从计算机系统的可用性出发,给出了高可用性问题的一般描述及群机方式的特色,进而提出了灾难备份的特殊考虑及SYBASE的灾难备份方案. 一.系统高可用性(High Availability)1.高可用性方案 美国商务 3535.us注册.Us美国 ...
用备份进行Active Directory的灾难重建 上篇博文中我们介绍了如何部署第一个域,现在我们来看看我们能够利用域来做些什么.域中的计算机可以共享用户账号,计算机账号和安全策略,我们来看看这些共享资源给我们在分配网络资源时带来了哪些改变.实验拓扑如下图所示,我们现在有个简单的任务,要把成员服务器Berlin上一个共享文件夹的读权限分配给公司的员工张建国 ...
HP-lefthand底层结构详解及存储灾难数据恢复 一.HP-lefthand的特点 HP-lefhand是一款非常不错的SAN存储,使用iscsi协议为客户端分配空间.它支持RAID5.RAID6以及RAID10.并且还支持卷快照,卷动态扩容等.常见的型号有:P,P4000等,基于市场占有量和软件定义存储的弊端,有一定的数据恢复市场需 ...
在本篇博文中我来测试下Exchange灾难重建,重建Exchange服务器需要注意以下问题. 1.恢复的服务器必须与丢失的服务器使用相同的操作系统 2.恢复的服务器必须与丢失的服务器拥有相同的性能特征和硬件配置 3.只能重建客户端访问服务器.集线器传输.邮箱或统一消息服务器角色的Exchange服务器,不能重建Exchange边缘服务器. 实验的网络拓扑图如 ...
目前大多数CPU都支持浮点运算单元FPU,FPU作为一个单独的协处理器放置在处理器核外,但是对于嵌入式处理器,浮点运算本来就少用,有些嵌入式处理器就会去掉浮点协处理器. X86处理器一般都是有FPU的.而ARM PPC MIPS处理器就会出现没有FPU的现象. linux kernel如何处理浮点运算,我们就分为带FPU的处理器和不带FPU的处理器来讨论.小木虫 --- 700万学术达人喜爱的学术科研平台
热门搜索:
&&一个随机变量能不能由两个随机变量相乘得到
一个随机变量能不能由两个随机变量相乘得到
一个高斯的随机变量是否能够通过另一个高斯的随机变量乘以一个与其独立的未知分布的随机变量得到?
X_1=X_2X_3
where X_1-N(x_1,\sigma_1^2) and X_2-N(x_2,\sigma_2^2) , X_2 and X_3 are independent.
链接打不开
问题是不同的。这里指的是一个高斯随机变量能否由另一个高斯随机变量乘以一个与它独立的未知分布的随机变量的。
个人觉得,在某种特殊的情况下可能有,但是有了之后不一定能解释的清楚。这个到底是什么分布
楼主搞bayesian?
我在做估计。两个随机变量的乘积或者商的分布有的,wikipedia可以查到,就不知道一个高斯变量拆分成另一个高斯随机变量和独立的未知分布的乘积这种情况存不存在。做个假设可否?
你可以看看这篇文章,能不能有点帮助。
Products and Convolutions of Gaussian Probability Density Functions。
在某些特殊的情况下可能存在,但是比较general 的结果可能没有
我也查过这类似的文章,product distribution 的确很相关,但是也只是说明两个随机变量乘积的分布存在,没有研究随机变量的运算可不可以存在像我的问题那样的情况。肯定有特例存在的,如果作假设让该问题成立,这样你觉得合理吗,
学术必备与600万学术达人在线互动!
扫描下载送金币
北京学而思教育科技有限公司 地址:北京市海淀区北三环甲18号中鼎大厦A座1层102室 电话:010-java中两个double数字相乘的结果_百度知道
java中两个double数字相乘的结果
double a = 3.2;
double b = 3.001;
System.out.print(a*b);a*b=9.0
我有更好的答案
java里面double和float类型是非精确数字类型,存在一定的误差,误差值具有随机性,如果要精确计算的,尽量避免用double和float
采纳率:71%
这个就是浮点数精度丢失造成的你用Decimal类来计算就没这问题了
Double num1=0.12;Double num2=0.13;Double num3=num1*num2;
为您推荐:
其他类似问题
double的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。还没有帐号? 赶紧
用户版块帖子
关于 51 单片机的乘法 问题
UID:119662
在线时间434小时
M币194专家11
比如说:1.2*2.154问题:计算结果怎么正确地在数码管或者lcd上显示出来
UID:541075
在线时间3592小时
M币22960专家43
浮点运算,太复杂不懂帮顶下
UID:982036
在线时间807小时
M币811专家-1
刚学。。。不知道说的对不对,定义一个变量,让变量等于此数,然吧此数赋给显示口
UID:815615
在线时间239小时
M币566专家3
浮点变量进行乘法运算显示结果稍微麻烦点,可以用sprintf打印成字符串然后显示
UID:73957
在线时间649小时
M币2372专家3
一般的显示方法不行吗
UID:924122
在线时间1760小时
M币6023专家9
取10的余数~~~
UID:119662
在线时间434小时
M币194专家11
引用第5楼cmheia于 22:57发表的&&: [表情] 取10的余数~~~ 能不能举例说明下
UID:119662
在线时间434小时
M币194专家11
搞懂了,sprintf可用
UID:822086
在线时间556小时
M币4253专家5
一定要那么精确吗?如果没有那么高的精度要求,可以转换为定点数来运算,然后显示出来。另外一个办法是,转换为整型数据运算,然后显示,但是你要知道小数点的位置在哪里,然后再显示的时候直接添加上去。
UID:1005682
在线时间322小时
M币158专家2
回 楼主(jiexiao) 的帖子
运算时候变量定义使用float型,比如a=1.2*2.154;理论上应该等于2.5848,所以你要先乘以10000倍,然后得到25848放在一个INT型,你只要一次显示2.&& 5&& 8&& 4&&&&8&& 就可以了
访问内容超出本站范围,不能确定是否安全
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:12-22 12:15, Total 0.527275(s) query 9,
Gzip enabled&3被浏览669分享邀请回答07 条评论分享收藏感谢收起

我要回帖

更多关于 浮点型变量 的文章

 

随机推荐