我被要求改进我们多年来一直使用的奇异值分解代码(它来自Numerical Recipes的可用于Fortran的最后一版),但有人将其改编为不同的真实kind
类型。我有一些问题,一个关于精度,另一个关于浮点比较,但首先是一些代码(仅显示相关内容):
implicit real(kind=selected_real_kind(12)) (a-h,o-z) ! not from Numerical Recipes
parameter R12 = selected_real_kind(12), eps=tiny(1.0_R12) ! not from Numerical Recipes
do i=1,n
scale=0.0
if (i.le.m) then
do k=i,m
scale=scale+abs(a(k,i))
end do
if (scale.ne.0.0) then
scale=0.0
应为scale=0.0_R12
,对吧?scale.ne.0.0
替换为scale.gt.0.0
(因为它不能<0)以避免显式.ne.
- 比较,或者我应该将其与某些epsilon进行比较是否可以代替?tiny
和epsilon
更适合在上述比较中选择epsilon值?(value.gt.eps .or. value.lt.-1.0_R12*eps)
会是一个明智的条件吗?感谢您的帮助!
答案 0 :(得分:3)
据我所知,
0.0_R12
可能更合理。将real(r12), parameter :: zero = 0.0_r12
定义为全局变量epsilon
使用tiny
value
可能是肯定的或否定,那么使用if(abs(value) > eps) then
可能是有意义的,而不是尝试在单个if语句中比较两个值。< / LI>
醇>
请注意,数字食谱是copyrighted material,即使在修改后,由于此版权,您也不允许分发它。最好使用LAPACK或其他一些GPL / BSD许可的线性代数包,而不是那种(古老和通常很慢)的材料。