ऐसा कोई मामला नहीं है जहां शून्य से एक विभाजन यहां हो सकता है।
श्रीमती सॉल्वर जेड 3 चल बिन्दु गणित सटीक आईईईई का समर्थन करता है। आइए Z3 को संख्या 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
। ऐसी कोई संख्या नहीं है।
उपरोक्त SMTLIB स्ट्रिंग भी Z3 को एक मनमाना गोलाई मोड ( rm
) चुनने की अनुमति देता है । इसका मतलब यह है कि परिणाम सभी संभव राउंडिंग मोड के लिए है (जिनमें से पांच हैं)। परिणाम में यह संभावना भी शामिल है कि खेलने में कोई भी चर NaN
या अनंत हो सकता है ।
a == b
fp.eq
गुणवत्ता के रूप में कार्यान्वित किया जाता है ताकि तुलना +0f
और -0f
समान हो। शून्य के साथ तुलना का उपयोग करके भी लागू किया fp.eq
जाता है। चूंकि सवाल शून्य से एक विभाजन से बचने के उद्देश्य से है, इसलिए यह उचित तुलना है।
यदि बिटवाइस समानता का उपयोग करके समानता परीक्षण लागू किया गया था, +0f
और -0f
बनाने का एक तरीका होगाa - b
शून्य । इस उत्तर के एक गलत पिछले संस्करण में जिज्ञासु के लिए उस मामले के बारे में मोड विवरण शामिल हैं।
Z3 ऑनलाइन अभी तक FPA सिद्धांत का समर्थन नहीं करता है। यह परिणाम नवीनतम अस्थिर शाखा का उपयोग करके प्राप्त किया गया था। इसे निम्नानुसार .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);
आईईईई नाव सवालों के जवाब देने जेड 3 का उपयोग करना अच्छा है क्योंकि यह मामलों को नजरअंदाज करने के लिए (जैसे कठिन है है NaN
, -0f
, +-inf
) और आप मनमाने ढंग से सवाल पूछ सकते हैं। विनिर्देशों की व्याख्या और हवाला देने की आवश्यकता नहीं है। आप मिश्रित फ्लोट और पूर्णांक प्रश्न भी पूछ सकते हैं जैसे कि "क्या यह विशेष int log2(float)
एल्गोरिथ्म सही है?"।