मुझे लगता है कि हिघम की सटीकता और न्यूमेरिकल एल्गोरिदम की स्थिरता से पता चलता है कि कोई भी इस प्रकार की समस्याओं का विश्लेषण कैसे कर सकता है। अध्याय 2 देखें, विशेष रूप से 2.8।
इस उत्तर में मैं कुछ ऐसी बात बताना चाहता हूं जो वास्तव में हिघम की पुस्तक में संबोधित नहीं की गई है (यह इस मामले के लिए बहुत व्यापक रूप से ज्ञात नहीं है)। यदि आप इन जैसे सरल संख्यात्मक एल्गोरिदम के गुणों को साबित करने में रुचि रखते हैं , तो आप आधुनिक SMT सॉल्वर ( Satisfiable Modulo Theories ) की शक्ति का उपयोग कर सकते हैं , जैसे कि z3 , जैसे Hbell में sbv जैसे पैकेज का उपयोग करना । यह पेंसिल और पेपर का उपयोग करने से कुछ आसान है।
मान लीजिए मैं दिया हूँ कि , और मुझे पता करना चाहते हैं तो जेड = ( x + y ) / 2 को संतुष्ट करता है एक्स ≤ जेड ≤ y । निम्नलिखित हास्केल कोड0≤x≤yz=(x+y)/2x≤z≤y
import Data.SBV
test1 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
test1 fun =
do [x, y] <- sFloats ["x", "y"]
constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
constrain $ 0 .<= x &&& x .<= y
let z = fun x y
return $ x .<= z &&& z .<= y
test2 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
test2 fun =
do [x, y] <- sFloats ["x", "y"]
constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
constrain $ x .<= y
let z = fun x y
return $ x .<= z &&& z .<= y
मुझे यह स्वचालित रूप से करने देगा । यहाँ test1 fun
है प्रस्ताव है कि सभी परिमित तैरता के लिए एक्स , वाई के साथ 0 ≤ एक्स ≤ y ।x≤fun(x,y)≤yx,y0≤x≤y
λ> prove $ test1 (\x y -> (x + y) / 2)
Falsifiable. Counter-example:
x = 2.3089316e36 :: Float
y = 3.379786e38 :: Float
यह बह गया। मान लीजिए मैं अब आपका दूसरा सूत्र लेता हूं: z=x/2+y/2
λ> prove $ test1 (\x y -> x/2 + y/2)
Falsifiable. Counter-example:
x = 2.3509886e-38 :: Float
y = 2.3509886e-38 :: Float
काम नहीं करता है (क्रमिक अधःप्रवाह की वजह से: , जो सभी गणित किया जा रहा है आधार -2 unintuitive कारण हो सकता है)।(x/2)×2≠x
अब आज़माएँ :z=x+(y−x)/2
λ> prove $ test1 (\x y -> x + (y-x)/2)
Q.E.D.
काम करता है! यह Q.E.D.
एक प्रमाण है कि test1
संपत्ति सभी फ्लोट के लिए रखती है जैसा कि ऊपर परिभाषित किया गया है।
x≤y0≤x≤y
λ> prove $ test2 (\x y -> x + (y-x)/2)
Falsifiable. Counter-example:
x = -3.1300826e34 :: Float
y = 3.402721e38 :: Float
y−xz=x+(y/2−x/2)
λ> prove $ test2 (\x y -> x + (y/2 - x/2))
Q.E.D.
x+(y/2−x/2)
(x+y)/2
x≤x+(y/2−x/2)≤ySFloat
SDouble
-ffast-math
(x+y)/2
पीपीपीएस मैं केवल साधारण बीजीय अभिव्यक्तियों को बिना किसी शर्त के देख रहा था। डॉन हैच का फार्मूला सख्ती से बेहतर है।