এখানে শূন্য দ্বারা বিভাজন ঘটতে পারে এমন কোনও ঘটনা নেই।
শ্রীমতি সমাধানকারী Z3 ফ্লোটিং পয়েন্ট গাণিতিক সুনির্দিষ্ট আইইইই সমর্থন করে। আসুন জেড 3 কে নম্বর a
এবং b
এরকম সন্ধান করতে বলুন a != b && (a - b) == 0
:
(set-info :status unknown)
(set-logic QF_FP)
(declare-fun b () (FloatingPoint 8 24))
(declare-fun a () (FloatingPoint 8 24))
(declare-fun rm () RoundingMode)
(assert
(and (not (fp.eq a b)) (fp.eq (fp.sub rm a b) +zero) true))
(check-sat)
ফলাফল হয় UNSAT
। এরকম কোনও সংখ্যা নেই।
উপরের এসএমটিআইএলবি স্ট্রিং জেড 3 কে একটি স্বেচ্ছাসেবী রাউন্ডিং মোড চয়ন করতে সহায়তা করে ( rm
)। এর মানে হল যে ফলাফলটি সম্ভাব্য সকল রাউন্ডিং মোডের জন্য রয়েছে (যার মধ্যে পাঁচটি রয়েছে)। NaN
ফলাফলটিতে প্লে-তে যে কোনও ভেরিয়েবল হতে পারে বা অসীমতার সম্ভাবনাও রয়েছে।
a == b
fp.eq
মানের হিসাবে প্রয়োগ করা হয় যাতে সমান +0f
এবং -0f
তুলনা। শূন্যের সাথে তুলনাটি fp.eq
পাশাপাশি ব্যবহার করা হয়। যেহেতু প্রশ্নটি শূন্যের দ্বারা বিভাজন এড়ানোর লক্ষ্যে এটি উপযুক্ত তুলনা।
যদি সাম্যতা পরীক্ষাটি বিটওয়াইজ সমতা ব্যবহার করে বাস্তবায়ন করা হত , +0f
এবং শূন্য -0f
করার উপায় ছিল a - b
। এই উত্তরের একটি ভুল পূর্ববর্তী সংস্করণে কৌতূহলীদের জন্য সেই মামলার মোডের বিশদ রয়েছে।
জেড 3 অনলাইন এখনও এফপিএ তত্ত্ব সমর্থন করে না। এই ফলাফলটি সর্বশেষতম অস্থির শাখা ব্যবহার করে প্রাপ্ত হয়েছিল। এটি নীচে NET বাইন্ডিং ব্যবহার করে পুনরুত্পাদন করা যেতে পারে:
var fpSort = context.MkFPSort32();
var aExpr = (FPExpr)context.MkConst("a", fpSort);
var bExpr = (FPExpr)context.MkConst("b", fpSort);
var rmExpr = (FPRMExpr)context.MkConst("rm", context.MkFPRoundingModeSort());
var fpZero = context.MkFP(0f, fpSort);
var subExpr = context.MkFPSub(rmExpr, aExpr, bExpr);
var constraintExpr = context.MkAnd(
context.MkNot(context.MkFPEq(aExpr, bExpr)),
context.MkFPEq(subExpr, fpZero),
context.MkTrue()
);
var smtlibString = context.BenchmarkToSMTString(null, "QF_FP", null, null, new BoolExpr[0], constraintExpr);
var solver = context.MkSimpleSolver();
solver.Assert(constraintExpr);
var status = solver.Check();
Console.WriteLine(status);
আইইইই ভাসা প্রশ্নের উত্তর দিতে Z3 ব্যবহার চমৎকার, কারণ এটি মামলা তত্ত্বাবধান করা (যেমন কঠিন হয় NaN
, -0f
, +-inf
) এবং আপনার নির্বিচারে প্রশ্ন করতে পারেন। স্পেসিফিকেশন ব্যাখ্যা এবং উদ্ধৃত করার প্রয়োজন নেই। এমনকি আপনি মিশ্র ভাসা এবং পূর্ণসংখ্যার প্রশ্নগুলি জিজ্ঞাসা করতে পারেন যেমন "এটি কি এই নির্দিষ্ট int log2(float)
অ্যালগরিদমটি সঠিক?"