Không có trường hợp nào sự phân chia bằng 0 có thể xảy ra ở đây.
Các SMT Solver Z3 hỗ trợ IEEE chính xác số học dấu chấm. Hãy yêu cầu Z3 tìm số a
và b
sao cho 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)
Kết quả là UNSAT
. Không có con số như vậy.
Chuỗi SMTLIB ở trên cũng cho phép Z3 chọn chế độ làm tròn tùy ý ( rm
). Điều này có nghĩa là kết quả giữ cho tất cả các chế độ làm tròn có thể (trong đó có năm chế độ). Kết quả cũng bao gồm khả năng bất kỳ biến nào trong trò chơi có thể là NaN
hoặc vô cùng.
a == b
được thực hiện như fp.eq
chất lượng để +0f
và -0f
so sánh bằng nhau. Việc so sánh với số không được thực hiện bằng cách sử dụng fp.eq
là tốt. Vì câu hỏi nhằm tránh sự phân chia bằng 0 nên đây là so sánh thích hợp.
Nếu xét nghiệm bình đẳng được thực hiện sử dụng bình đẳng Bitwise, +0f
và -0f
sẽ là một cách để làm cho a - b
không. Một phiên bản trước không chính xác của câu trả lời này chứa chi tiết chế độ về trường hợp đó cho người tò mò.
Z3 Online chưa hỗ trợ lý thuyết FPA. Kết quả này thu được bằng cách sử dụng nhánh không ổn định mới nhất. Nó có thể được sao chép bằng các ràng buộc .NET như sau:
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);
Sử dụng Z3 để trả lời câu hỏi IEEE phao là tốt đẹp vì rất khó để bỏ qua trường hợp (ví dụ như NaN
, -0f
, +-inf
) và bạn có thể đặt câu hỏi tùy ý. Không cần phải giải thích và trích dẫn thông số kỹ thuật. Bạn thậm chí có thể hỏi các câu hỏi hỗn hợp và số nguyên như " int log2(float)
thuật toán cụ thể này có đúng không?".