Burada sıfıra bölmenin olabileceği bir durum yoktur.
SMT Çözücü Z3 kayar nokta aritmetik hassas IEEE destekler. Z3'ten sayıları bulmasını isteyelim a
ve b
şöyle 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)
Sonuç UNSAT
. Böyle bir numara yok.
Yukarıdaki SMTLIB dizisi ayrıca Z3'ün rastgele bir yuvarlama modu ( rm
) seçmesine izin verir . Bu, sonucun tüm olası yuvarlama modları için geçerli olduğu anlamına gelir (bunlardan beş tane vardır). Sonuç, oyundaki değişkenlerden herhangi birinin NaN
sonsuz olma olasılığını da içerir .
a == b
olarak uygulanır fp.eq
ve böylece kalite +0f
ve -0f
eşit karşılaştırın. Sıfırla karşılaştırma da kullanılarak gerçekleştirilir fp.eq
. Soru, sıfıra bölünmeden kaçınmayı amaçladığından, bu uygun bir karşılaştırmadır.
Eşitlik testi bitsel eşitlik kullanılarak uygulanmış olsaydı +0f
ve -0f
bunu yapmanın bir yolu olurdua - b
sıfır . Bu cevabın yanlış bir önceki versiyonu, meraklı için bu durumla ilgili mod ayrıntılarını içerir.
Z3 Online henüz FPA teorisini desteklemiyor. Bu sonuç, en son kararsız dal kullanılarak elde edildi. Aşağıdaki gibi .NET bağlamaları kullanılarak çoğaltılabilir:
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);
O (örneğin davaları göz ardı etmek zordur çünkü IEEE şamandıra sorulara cevap Z3 kullanarak güzel NaN
, -0f
, +-inf
) ile keyfi sorular sorabilirsiniz. Spesifikasyonları yorumlamaya ve alıntı yapmaya gerek yok. "Bu belirli int log2(float)
algoritma doğru mu?" Gibi karışık kayan nokta ve tamsayı soruları bile sorabilirsiniz .