作者sjgau (sjgau)
看板Fortran
标题Re: [问题] 可以判断整数吗?
时间Mon Dec 27 05:35:41 2010
所谓的经验,绝对 不是ㄧ个数字,
或是 ㄧ组数字。
那是 ㄧ个简单的 说法。
所谓的经验,是累积了很多实务上 解决问题的经验,
能够 case by case 的针对 新的问题,
想出一个或 数个迅速解决问题的 方法。
回到原先的问题。
real*4 , or real*8 x, y, z
sqrt(x) --> y
如何证明 y 是整数。
如果 限定 x <= +2147483647
那麽,
let x= +2147483647
y= x - 1
sqrt(x) --> x1
sqrt(y) --> y1
eps= fabs(x1 - y1)*0.8
// * 0.8 , is a margine 考量
如此ㄧ来,任何数的
sqrt(x) --> y
y 的四舍五入 --> iy
if (fabs(y - iy) < eps ) then
// y is a integer
end if
针对以上,请问大家 是否同意?
※ 引述《perturb (背後有老板)》之铭言:
: 我这帖虽纯属抬杠
: 但也是为了讨论问题
: 请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)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.137.104.67
1F:→ blc:就原来的问题而言,用不到浮点数… 12/28 14:23