-- | -- = 第3章 練習問題 F -- -- * y が √x の近似であるとき,x / y も √x の近似であるが,これらより良い近似は何か. -- -- 答: (y + x / y) / 2 -- -- * 絶対誤差検査と相対誤差検査のどちらが適切か. -- -- 答: 相対誤差検査 -- -- * @sqrt :: Float -> Float@ を定義せよ. -- -- @ -- sqrt :: Float -> Float -- sqrt x = until goodenough improve x -- where -- goodenough y = abs (y * y - x) < eps * x -- improve y = (y + x / y) / 2 -- eps = 0.000001 -- @ module TFwH.Chap03.ExF where import Prelude hiding (sqrt) -- | -- Float の平方根 sqrt :: Float -> Float sqrt x = until goodenough improve x where goodenough y = abs (y * y - x) < eps * x improve y = (y + x / y) / 2 eps = 0.000001 -- | -- Float の平方根 -- 相対誤差の閾値 eps として Float の機械イプシロンを使う sqrt' :: Float -> Float sqrt' x = until goodenough improve x where goodenough y = abs (y * y - x) <= meps * x improve y = (y + x / y) / 2 -- | -- Floatに対する機械イプシロン -- meps :: Float meps = until (\ x -> 1 + x == 1) (/ 2) (1 :: Float)