您好、欢迎来到现金彩票网!
当前位置:满堂彩 > 浮点变量 >

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

发布时间:2019-06-06 08:06 来源:未知 编辑:admin

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  不知你注意没有,这个很寻常的等式,你如果将它放在C++中,Java中,Basic中,它

  居然是不成立的。计算机在开玩笑吗?噢,对了,隐约记得这好象是浮点数的问题,似乎

  嗯,如果你不遇到此问题,那你完全可以把它抛到火星上去,可惜,偶不好彩,这样的

  这得从浮点数的在计算机内的存储开始说起,我这里闲话少说。我们只谈双精度double

  阶码:是一个偏移量,1023的偏移量,它的1023相当于0,小于1023时为负,

  好了,我们可以比较一下3.02和计算结果,果然有所不同,只不过最后一个bit不同嘿。

  先把1.01的幂次变为1(与2.01的阶码相同),于是,将尾数右移一位。得到:

  因此,结论出来了,因为浮点数在计算机内的存储存在偏差,导致运算时,与实际期望的

  结果不同。很多时候,你可以不理它,但是,可以肯定负责任的说,发射卫星的运算时,你需要知道,否则,卫星一转眼就不见了。

  不要用浮点数来存储浮点,对于VC,Java,Basic,最好的办法是用Decimal来保存它。

  三:在C/C++中,似乎很不情愿看到类似上例中的代码,因为它看起来很低效,还有其它方法

  尾数一共有52个bit,也就是最小能表示的数是 2^-52,取对数可得出,约是

  在小数点后16位,那也就是说小数点后15位是可以精确表示的,加上前置的默认1,一共有16

  假设dbl1=1.01 那么,16减去整数位1,我们可以假定,在计算机表示中:

  凭经验我们可以知道,两个小数相加,小数点后的精度不会大于精度销大的一个。

  再做假设吧,假设dbl1有两位小数,dbl2也有两位小数,按理论,可得出相乘后,最大可能是2+2位小数。那么,我们按照 4位小数进行Round处理,可能会得出正确的结果。

  实际上,要取一个双精度的10进制表达的小数位,我没有找到什么好办法,我能想到的:也就是将数字转为字串,然后查找.后的位数。这样,显然是非常低效的,这里,我就不再写出代码了。

  六:比较方法一和方法二。方法二并不高效,并且还有一些不定因素,所以,最好采用方法一来统一处理浮点数的运算。

  至于效率,实际上最佳方法是从程序的设计着手,将double从程序中去除掉。

  比如在VC中,可以用Variant::Decimal来彻底替换double,这样,就不存在中间的转换了,效率自然就提高了。有关Decimal的常用函数是:

  很想找到一种更好的方法,总觉得用Decimal来进行运算很不爽,但真的没找到?

http://login4porn.com/fudianbianliang/381.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有