代码之家  ›  专栏  ›  技术社区  ›  Patrick Trentin

如何通过非标准的扁平锌扩展获得有理数的精确无限精度表示?

  •  1
  • Patrick Trentin  · 技术社区  · 6 年前

    默认情况下 mzn2fzn 自动计算 微型计算机 建模,并将其存储为常量 浮动 结果中的值 扁锌 模型。

    例子:

    文件 test.mzn

    var float: x;
    constraint      1.0 / 1000000000000000000000000000000000.0 <= x;
    constraint x <= 2.0 / 1000000000000000000000000000000000.0;
    solve satisfy;
    

    用翻译

    mzn2fzn test.mzn
    

    等于

    var 1e-33..2e-33: x;
    solve satisfy;
    

    相反,我们想要得到的是 扁锌 沿以下行归档:

    var float: x;
    var float: lb;
    var float: ub;
    constraint float_div(1.0, 1000000000000000000000000000000000.0, lb);
    constraint float_div(2.0, 1000000000000000000000000000000000.0, ub);
    solve satisfy;
    

    哪里 float_div() 是一个 最近 引入,非标准, 扁锌 约束。

    是否可以通过使用 std 约束目录,或者此编码是否需要对 MZN2FZn 工具?在后一种情况下,我们能得到一些指导吗?


    ***:我们有一些公式不适合有限精度浮点表示,因为它改变了 SAT 结果 UNSAT .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Dekker1    6 年前

    目前还没有一种可以产生无限精度的扁锌的方法。尽管这个想法已经讨论过几次了,但是它需要使用一个可以提供这些无限精确类型的库来重写或附加大量的minizinc。像这样的图书馆,比如Boost interval 库,似乎缺乏选择,目前不编译所有的机器目标上的微型锌分布。对于无限精确类型,似乎有许多有趣的例子,但是在Minizinc编译器的实现中,我们仍然在寻找一种合适的实现方法。

    虽然无限精度不在表上。根据浮点标准,minizinc编译器确实希望是正确的。随时报告可能发生的任何问题 MiniZinc Issue Tracker .

    推荐文章