Re: [問題] 可以判斷整數嗎?

看板Fortran作者 (sjgau)時間14年前 (2010/12/27 05:35), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串9/9 (看更多)
所謂的經驗,絕對 不是ㄧ個數字, 或是 ㄧ組數字。 那是 ㄧ個簡單的 說法。 所謂的經驗,是累積了很多實務上 解決問題的經驗, 能夠 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

12/28 14:23, , 1F
就原來的問題而言,用不到浮點數…
12/28 14:23, 1F
文章代碼(AID): #1D5xKoHm (Fortran)
討論串 (同標題文章)
文章代碼(AID): #1D5xKoHm (Fortran)