【发布时间】:2021-12-09 04:20:05
【问题描述】:
我正在使用 Z3 的 python API 来做一些线性实数运算。我遇到过非常接近零的实数以某种方式转换为 1.0/0.0 的情况。这反过来又会导致 Z3 的 C++ 部分内部出现浮点异常。
例如,我有以下 Python 程序:
from z3 import *
s = Solver()
s.add(0.00001 * Real("a") + 0.00001 * Real("b") > 0.0)
print(s.to_smt2())
result = s.check()
print(result)
print(s.model())
产生以下输出:
; benchmark generated from python API
(set-info :status unknown)
(declare-fun b () Real)
(declare-fun a () Real)
(assert
(let ((?x10 (+ (* (/ 1.0 0.0) a) (* (/ 1.0 0.0) b))))
(> ?x10 0.0)))
(check-sat)
Floating point exception (core dumped)
如果我将第 3 行替换为
#s.add(Q(1,100000) * Real("a") + Q(1, 100000) * Real("b") > 0.0)
我得到了预期的输出。
有没有人有解释和方法,我可以通过使用普通的 Python 浮点数来让它工作?
【问题讨论】:
标签: python floating-point z3 z3py real-datatype