fz4 发表于 2008-9-15 08:13

求助:关于精度问题

tan(-pi/4)*5

ans =

      -5      

>> 1/tan(-pi/4)*5

ans =

      -5      

>> 1/tan(-pi/4)*5+5

ans =

      -1/1125899906842624

最后一次算的时候他把pi/4给先算出来了再代入了,怎么样可以防止这个误差呢

sigma665 发表于 2008-9-15 10:20

回复 楼主 fz4 的帖子

运算优先级的问题
可以用括号
1/tan(-pi/4)*5+5
ans =
-8.8818e-016

不过,我没有出现你所说的情况

[ 本帖最后由 sigma665 于 2008-9-15 10:22 编辑 ]

fz4 发表于 2008-9-15 20:22

?我只是把那个用分数表示了,我算出来跟你一样的其实,反正不是0,可是应该要=0

无水1324 发表于 2008-9-15 21:57

回复 板凳 fz4 的帖子

这个应该是matlab里面计算的容许误差,

sogooda 发表于 2008-9-15 23:03

-8.8818e-016

双精度能表示的最高精度好像就是到1e-16这个数量级了。
不过,好像可以通过类似符号计算之类的方法得到精确解(记得好像看过类似的东西,不能肯定),具体的方法得再找找

fz4 发表于 2008-9-16 07:30

可是这个关键出在了我的一个判断语句中,要判断它是大于零还是小于零还是=0~然后整个事情就变了。。。

ChaChing 发表于 2008-9-16 08:21

回复 6楼 fz4 的帖子

其实问题出在tan这函数 !
不要忘记, matlab是使用数值方式求tan, 并无法正确得到tan(pi/4)=1
所以使用判断语句就需要小心 !
for your reference :
format long e; tan(-pi/4)
if (1/tan(-pi/4)*5)==5, disp('try'); end
if (1/tan(-pi/4)*5-5)<eps, disp('try'); end

sigma665 发表于 2008-9-16 09:31

回复 6楼 fz4 的帖子

跟0比较,不能直接比
应该与一个很小的数比
这个应该是常识了

ChaChing 发表于 2008-9-16 10:03

回复 8楼 sigma665 的帖子

不一定仅有0!
任何两数相比都要小心
页: [1]
查看完整版本: 求助:关于精度问题