আমি মনে করি যে হিগমের নির্ভুলতা এবং সংখ্যাগত অ্যালগোরিদমসের স্থায়িত্ব কীভাবে এই ধরণের সমস্যাগুলি বিশ্লেষণ করতে পারে তা সম্বোধন করে। অধ্যায় 2 দেখুন, বিশেষত অনুশীলন 2.8।
এই উত্তরে আমি এমন কিছু নির্দেশ করতে চাই যা হিগামের বইয়ে সত্যই সম্বোধন করা হয়নি (এ বিষয়টি সম্পর্কে এটি খুব বেশি পরিচিত বলে মনে হয় না)। আপনি যদি এই জাতীয় সাধারণ অ্যালগোরিদমগুলির বৈশিষ্ট্যগুলি প্রমাণ করতে আগ্রহী হন তবে আপনি আধুনিক এসএমটি সলভারগুলির ( সন্তুষ্টিযোগ্যতা মডুলো থিওরিজ ) যেমন z3 এর মতো , হ্যাসকেলে sbv এর মতো একটি প্যাকেজ ব্যবহার করে ব্যবহার করতে পারেন । এটি পেন্সিল এবং কাগজ ব্যবহারের চেয়ে কিছুটা সহজ।
ধরুন আমি সেই দিয়েছি এবং আমি জানতে চাই z = ( x + y ) / 2 সন্তুষ্ট x ≤ z ≤ 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
হয় প্রতিজ্ঞা যে সব সসীম ভাসে জন্য এক্স , Y সঙ্গে 0 ≤ এক্স ≤ Y ।x≤fun(x,y)≤yএক্স ,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
কাজ করে না (ধীরে ধীরে আন্ডারফ্লোর কারণে: , যা সমস্ত পাটিগণিত বেস -২ হওয়ার কারণে অপ্রকাশিত হতে পারে)।( x / 2 ) × 2 ≠ x
এখন :z- র= x + ( y)- এক্স ) / 2
λ> prove $ test1 (\x y -> x + (y-x)/2)
Q.E.D.
কাজ করে! Q.E.D.
একটি হল প্রমাণ যে test1
সম্পত্তি হিসেবে উপরে বর্ণিত সব ভাসে জন্য ঝুলিতে।
একই সম্পর্কে, তবে ( 0 ≤ x ≤ y এর পরিবর্তে ) সীমাবদ্ধ ?x ≤ y0 ≤ x ≤ y
λ> prove $ test2 (\x y -> x + (y-x)/2)
Falsifiable. Counter-example:
x = -3.1300826e34 :: Float
y = 3.402721e38 :: Float
ঠিক আছে, তাই যদি ওভারফ্লো হয় তবে z = x + ( y / 2 - x / 2 ) কেমন?Y- এক্সz- র= x + ( y)/ 2-এক্স / 2)
λ> prove $ test2 (\x y -> x + (y/2 - x/2))
Q.E.D.
সুতরাং দেখে মনে হচ্ছে যে সূত্রগুলি আমি এখানে চেষ্টা করেছি তার মধ্যে কাজ করছে বলে মনে হচ্ছে (একটি প্রমাণ সহ,)। এসএমটি সলভার পদ্ধতিটি আমার কাছে পেনসিল এবং কাগজের সাথে ভাসমান-পয়েন্ট ত্রুটি বিশ্লেষণের মধ্য দিয়ে যাওয়ার চেয়ে সহজ ভাসমান-বিন্দু সূত্র সম্পর্কে সন্দেহের উত্তর দেওয়ার অনেক দ্রুত উপায় বলে মনে হয়।x + ( y)/ 2-এক্স / 2)
পরিশেষে, নির্ভুলতা এবং স্থায়িত্বের লক্ষ্য প্রায়শই পারফরম্যান্সের লক্ষ্যের সাথে দ্বন্দ্বপূর্ণ হয়। পারফরম্যান্সের জন্য, আমি সত্যিই দেখতে পাই না আপনি কীভাবে চেয়ে আরও ভাল করতে পারবেন , বিশেষত যেহেতু সংকলকটি এখনও আপনার জন্য মেশিনের নির্দেশিকায় এটি অনুবাদ করার ভারী উত্তোলন করবে।( এক্স +)y) / 2
পিএস এগুলি হ'ল একক-নির্ভুলতা আইইইই 7575৫ ভাসমান-পয়েন্ট পাটিগণিতের সাথে। আমি ডাবল-স্পষ্টতা পাটিগণিত (এর সাথে প্রতিস্থাপন ) সহ পরীক্ষা করেছিলাম এবং এটি খুব কার্যকর হয়।x ≤ x + ( y)/ 2-এক্স / 2)≤ySFloat
SDouble
পিপিএস কোডটিতে এটি প্রয়োগ করার সময় একটি বিষয় মনে রাখতে হবে যে সংকলক পতাকাগুলির মতো -ffast-math
(এই জাতীয় পতাকাগুলির কিছু ফর্মগুলি কখনও কখনও কিছু সাধারণ সংকলকগুলিতে ডিফল্টরূপে চালু করা হয় ) এর ফলস্বরূপ আইইইই 7575৫ পাটিগণিত হয় না, যা উপরের প্রমাণগুলিকে অকার্যকর করে দেয়। আপনি যদি এমন পতাকা ব্যবহার করেন যা সক্ষম করে, যেমন, সহযোগী সংযোজন অপ্টিমাইজেশন, তবে ব্যতীত অন্য কিছু করার কোনও মানে নেই ।( x + y)) / 2
পিপিপিএস আমি শর্ত ছাড়াই কেবল সাধারণ বীজগণিতিক অভিব্যক্তিগুলিতে একটু তাকিয়ে চলেছি । ডন ডিম পাড়া এর সূত্র কঠোরভাবে উত্তম।