主题:[讨论]关于余弦角度不精确的问题
yyshen55555
[专家分:0] 发布于 2010-09-13 10:50:00
我的程序中得到的角度值很小,d-5/-6,用内部余弦函数求得的结果是1,而不是准确值,该怎样处理能得到最精确的值呢?
我最终的目的是要求一个旋转矩阵r(2,2)
r(1,1)=cos(a);r(1,2)=sin(1,2)
r(2,1)=-r(1,2)r(2,2)=r(1,1)
我的处理办法是r(1,1)=r(1,1)+/-r(1,2),使得r(1,1)**2+r(1,2)**2近似等于1,但是好像循环有累积误差,会发散,不知道该怎样处理能更精确一些。
大虾们有遇到过类似的问题吗?
回复列表 (共9个回复)
沙发
jstzhurj [专家分:4680] 发布于 2010-09-13 12:54:00
d0达不到你的精度要求么?
板凳
adda [专家分:1520] 发布于 2010-09-13 14:56:00
用双精度数。
print *, cos( 1e-5_4 )
print *, cos( 1e-5_8 )
print *, cos( 1e-5_16 )
IVF的计算结果依次是
1.000000
0.999999999950000
0.999999999950000000000416666666665
3 楼
jstzhurj [专家分:4680] 发布于 2010-09-13 15:21:00
双精度数有的编译器不支持,不知道楼主用的什么编译器。
4 楼
adda [专家分:1520] 发布于 2010-09-13 16:01:00
[quote]
双精度数有的编译器不支持,不知道楼主用的什么编译器。[/quote]
双精度肯定支持啊,是fortran标准
real(16)倒是有可能不支持
不过就LZ的问题,根本解决方法还是修改算法
5 楼
yyshen55555 [专家分:0] 发布于 2010-09-13 16:04:00
我的程序需要循环非常多次,累积下来误差很大,
7 楼
jstzhurj [专家分:4680] 发布于 2010-09-13 16:07:00
对对,四倍精度有的编译器不支持。
8 楼
yyshen55555 [专家分:0] 发布于 2010-09-13 16:09:00
原来我的r就是按照理论公式直接写的,但是因为有的r(1,1)**2+r(1,2)**2>1,运行通不过,所以我就自己改了算法,但是这样累计先来误差还是挺大的,不知该如何是好
9 楼
cgl_lgs [专家分:21040] 发布于 2010-09-13 16:49:00
晕啊,cos的参数可是弧度制的啊,这样竟然还需要小数点五位后?那么微小的转动不应该用这样的方式来做了吧,应该对角度做累积然后做一次变换。或是说用全量+增量方式,对于一定的角度内用某个固定值+增量值。
我来回复