Re: [問題] 可以判斷整數嗎?
我這帖雖純屬抬槓
但也是為了討論問題
請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
討論串 (同標題文章)
Fortran 近期熱門文章
PTT數位生活區 即時熱門文章