作者perturb (背後有老板)
看板Fortran
标题Re: [问题] 可以判断整数吗?
时间Sun Dec 26 19:32:47 2010
我这帖虽纯属抬杠
但也是为了讨论问题
请sjgau朋友宽恕则个
实际应用中我自己也是定义一个eps
这个值针对不同具体问题有所不同
对於实际问题当相对误差小於这个值的时候这个误差就可以忽略不计了
但是这个值是否完全只能靠经验呢? 那也未必见得
比如下面这个例子
PROGRAM TEST
IMPLICIT NONE
real(4)::r4, y, iy
real(4), parameter::eps = 1.0E-5
logical, external::ISINT
integer::I
do I=-3,3
r4 = 1. + eps*I
y = sqrt(r4)
iy = nint(y)
write(*, *)r4, y, iy, ISINT(y, iy)
enddo
END
FUNCTION ISINT(y, iy)
implicit none
real(4)::y, iy
real(4), parameter::eps=1.0E-5
logical::ISINT
if (abs(y-iy)/min(abs(y), abs(iy)) < eps) then
ISINT = .TRUE.
else
ISINT = .FALSE.
endif
END FUNCTION ISINT
按照sjgau朋友给出的标准1-2EPS, 1+2 EPS这个区间能够由real*4表示的数开平方都被
当成整数, 这当然在实际问题中很多时候可以接受这个近似
这个例子构造的时候实际是利用 d log(x^2) = 2 d log(x)
即开平方後近似有相对误差减半
也可以反推出你对x可以容忍的相对误差为e的话, 那个判断里面的EPS就可以取成e/2
具体到这个问题可以有个计算精度误差内的精确判断
y=sqrt(x)
I=aint(y)
用abs(x-I*I) < spacing(x) 来判断
我虽然没测试但是认为对於0<=x<=HUGE(1)应该是没太大问题的
对於一般的复杂的算式
其实也可以估算误差的
比如y=f(x) 精确值是x0, y0 由dy~f'(x0)dx
我们假定库函数求值对於计算精度内是精确的
则可以知道abs(y-y0) <= max( spacing(y), |f'(x)| spacing(x) )
不过一般没这个必要就是了
※ 引述《sjgau (sjgau)》之铭言:
: 我会!
: real*4, or real*8 都可以。
: real*4 x, y, z;
: x= 16.0
: y= sqrt(x)
: iy= int(y + 0.5)
: ! int() 还要 查ㄧ下,目的是 把 y 四舍五入,
: ! 取最接近的 整数
: if (rel_diff(iy, y) < 1.0e-5) then
: ! y 是整数
: else
: ! y 不是整数
: end if
: ! rel_diff(a, b) 是自己写的 副程式, 计算 a, b 的相对误差
: ! 相对误差等於 = (abs_diff(a, b))/max(abs(a), abs(b))
: ! abs_diff(a, b) 是自己写的副程式,求 a, b 两个数字的 绝对误差
: ! 绝对误差= abs(a - b)
: ※ 引述《pillbox1989 (如履薄冰)》之铭言:
: : 我想要确定开方後的值是整数
: : 利用if 判断
: : 但是一直想不到限制条件可以打甚麽?
: : 还是有其他更好的方法呢?
: : 谢谢大家
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 162.105.195.208