Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. import Data.SBV
  2.  
  3. test1 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
  4. test1 fun =
  5. do [x, y] <- sFloats ["x", "y"]
  6. constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
  7. constrain $ 0 .<= x &&& x .<= y
  8. let z = fun x y
  9. return $ x .<= z &&& z .<= y
  10.  
  11. test2 :: (SFloat -> SFloat -> SFloat) -> Symbolic SBool
  12. test2 fun =
  13. do [x, y] <- sFloats ["x", "y"]
  14. constrain $ bnot (isInfiniteFP x) &&& bnot (isInfiniteFP y)
  15. constrain $ x .<= y
  16. let z = fun x y
  17. return $ x .<= z &&& z .<= y
  18.  
  19. λ> prove $ test1 (x y -> (x + y) / 2)
  20. Falsifiable. Counter-example:
  21. x = 2.3089316e36 :: Float
  22. y = 3.379786e38 :: Float
  23.  
  24. λ> prove $ test1 (x y -> x/2 + y/2)
  25. Falsifiable. Counter-example:
  26. x = 2.3509886e-38 :: Float
  27. y = 2.3509886e-38 :: Float
  28.  
  29. λ> prove $ test1 (x y -> x + (y-x)/2)
  30. Q.E.D.
  31.  
  32. λ> prove $ test2 (x y -> x + (y-x)/2)
  33. Falsifiable. Counter-example:
  34. x = -3.1300826e34 :: Float
  35. y = 3.402721e38 :: Float
  36.  
  37. λ> prove $ test2 (x y -> x + (y/2 - x/2))
  38. Q.E.D.
  39.  
  40. if max(abs(x),abs(y)) >= 1.:
  41. return x/2. + y/2.
  42. else:
  43. return (x+y)/2.
  44.  
  45. float difference = max(x, y) - min(x, y);
  46. return min(x, y) + (difference / 2.0);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement