| Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) | 
![]()  | 
	
| 
	 | 
| 		
			
			 | 
		#1 | 
| 
			
			 初级会员 
			
			
			
				
			
			注册日期: 2011-12-13 
				
				年龄: 36 
				
					帖子: 5
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			大家好,我是菜鸟,问题如题,请各位大虾不吝赐教。 
		
		
		
		
		
		
		
	我用的是R2010a 0.3+0.15-0.45=-5.5511e-017  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#2 | 
| 
			
			 初级会员 
			
			
			
				
			
			注册日期: 2011-12-13 
				
				年龄: 36 
				
					帖子: 5
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			为什么0.3+0.17结果就是0呢?  还有如果我所编的程序中 有一条if语句的条件是"a>=b"  而b假设提前给定为0.45 而a又恰巧是0.3和0.15求和的结果呢 这样的话本该成立的条件便不成立了 这样的不确定性该怎么解决呢?  谢谢大家 请大家指教~
		 
		
		
		
		
		
		
		
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#3 | 
| 
			
			 初级会员 
			
			
			
				
			
			注册日期: 2011-12-13 
				
				年龄: 36 
				
					帖子: 5
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			还有如果在matlab中输入 (0.3+0.15)==0.45结果为‘假’ 而在mathematica中 虽然0.3+0.15-0.45也不为0 结果为-5.55112*10^-17 但是在mathematica 中输入(0.3+0.15)==0.45 结果为‘真’显然mathematica将此误差忽略了 而matlab却做不到 编程时有什么方法避免这个缺陷呢 谢谢
		 
		
		
		
		
		
		
		
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#4 | 
| 
			
			 初级会员 
			
			
			
				
			
			注册日期: 2011-11-22 
				住址: 最专业的源代码、论文支持, http://gulaoshi2.blog.163.com/ 
				年龄: 50 
				
					帖子: 7
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			太恐怖了,果真如此!
		 
		
		
		
		
		
		
		
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#5 | 
| 
			
			 初级会员 
			
			
			
			注册日期: 2011-09-14 
				
				年龄: 46 
				
					帖子: 8
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			我用2011b试了,也是这个结果,无法理解
		 
		
		
		
		
		
		
		
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#6 | 
| 
			
			 初级会员 
			
			
			
				
			
			注册日期: 2011-12-13 
				
				年龄: 36 
				
					帖子: 5
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			http://matlab.wikia.com/wiki/FAQ#Why...ual_to_zero.3F 
		
		
		
		
		
		
		
	谢谢你关注这个问题 我看到你在ilovematlab发的帖子了 其实我是在两个论坛同时提的问题 我后来又去mathworks.cn(matlab官网)提了这个问题 有人给我回复了以上那个网址。现在我明白了,这个问题是编程的常见问题,一般的编程语言都不例外,因为任何数据在电脑中都是以二进制的形式存储的,在一来一回的转换过程中就出现了误差。比如说计算1/3到任意精度,然后再用这个结果乘以3,不论什么样的精度都达不到1。你可以通过上面那个网址找到更详细的解答,及在判断两个浮点数相等时的解决方案(abs(a-b)<给定误差),还有相关浮点数运算的文献。希望能有所帮助,共勉。  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#7 | 
| 
			
			 初级会员 
			
			
			
				
			
			注册日期: 2011-12-14 
				
				
				
					帖子: 1
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			>> x=1/3 
		
		
		
		
		
		
		
	x = 0.3333 >> y=x*3 y = 1 >> t=3*x t = 1 为什么这里并不是引用网址中说的那样,我得到的是1。以上代码和0.3+0.15-0.45的区别在哪里?  | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#8 | 
| 
			
			 初级会员 
			
			
			
				
			
			注册日期: 2011-12-13 
				
				年龄: 36 
				
					帖子: 5
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			链接上所说1/3的例子是指用手算,matlab中将3*0.333近似为1,是否因为误差太小,这个问题还有待继续研究。 至于将1/3的例子和本帖的问题联系起来的原因是,分数-小数,十进制-二进制 在这两种转换过程中都会出现偏差。表面上这样理解即可。  但是如果在matlab中存储1/3,这个过程便更复杂,因为上述的两个过程会同时出现,至于先后顺序,我的理解是,先将1和3转换为2进制再进行除法计算。如果按此顺序理解,那么0.3/0.15会出现更大的偏差,因为0.3和0.15都无法再2进制中准确描述,但是matlab中运行结果为精确的2,这个结论便把我对于顺序的推测推翻了。   至于这个问题的最终解答,链接中提供的文献应该有所涉及。共勉。
		 
		
		
		
		
		
		
		
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#9 | 
| 
			
			 初级会员 
			
			
			
			注册日期: 2011-09-14 
				
				年龄: 46 
				
					帖子: 8
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			以后做a==b的判断时要特别小心了
		 
		
		
		
		
		
		
		
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 | 
| 		
			
			 | 
		#10 | 
| 
			
			 初级会员 
			
			
			
			注册日期: 2011-09-14 
				
				年龄: 46 
				
					帖子: 8
				 
				
				
				声望力: 0 ![]()  | 
	
	
	
		
		
			
			 
			
			试了几个其他的类似三个浮点数加减,结果都为0,这个为何不为0
		 
		
		
		
		
		
		
		
	 | 
| 
		 | 
	
	
	
		
		
		
		
			 
		
		
		
		
		
		
		
			
		
		
		
	 |