首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何摆脱SBV中-0.0的解决方案

如何摆脱SBV中-0.0的解决方案
EN

Stack Overflow用户
提问于 2015-03-26 16:01:29
回答 2查看 98关注 0票数 3

以下代码(使用SBV):

代码语言:javascript
复制
{-# LANGUAGE ScopedTypeVariables #-}
import Data.SBV
main :: IO ()
main = do
    res <- allSat zeros
    putStrLn $ show res

zeros :: Predicate
zeros = do
    z1 <- sDouble "Z1"
    constrain $ z1 .== 0.0
    return true

生成两个解决方案:

代码语言:javascript
复制
Solution #1:
  Z1 = 0.0 :: SDouble
Solution #2:
  Z1 = -0.0 :: SDouble
Found 2 different solutions.

如何消除无趣的-0.0解决方案?我不能使用z1 ./= -0.0,因为当z10.0时也是如此。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-30 00:40:58

[在提供适当支持的Hackage (http://hackage.haskell.org/package/sbv)上发布sbv4.4之后更新。]

假设您拥有SBV >= 4.4,现在可以这样做:

代码语言:javascript
复制
Prelude Data.SBV> allSat $ \z -> z .== (0::SDouble)
Solution #1:
  s0 = 0.0 :: Double
Solution #2:
  s0 = -0.0 :: Double
Found 2 different solutions.
Prelude Data.SBV> allSat $ \z -> z .== (0::SDouble) &&& bnot (isNegativeZeroFP z)
Solution #1:
  s0 = 0.0 :: Double
This is the only solution.
票数 3
EN

Stack Overflow用户

发布于 2015-03-26 17:19:14

根据这些注释,以下代码只生成一个解决方案:

代码语言:javascript
复制
zeros :: Predicate
zeros = do
    z1 <- sDouble "Z1"
    constrain $ z1 .== 0.0 &&& ((1 / z1) .> 0)
    return true

输出:

代码语言:javascript
复制
Solution #1:
  Z1 = 0.0 :: SDouble
This is the only solution.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29283304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档