mirror of
https://github.com/Z3Prover/z3
synced 2025-04-25 01:55:32 +00:00
193 lines
5.5 KiB
Java
193 lines
5.5 KiB
Java
/*++
|
|
Copyright (c) 2013 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
FPNum.java
|
|
|
|
Abstract:
|
|
|
|
Author:
|
|
|
|
Christoph Wintersteiger (cwinter) 2013-06-10
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
package com.microsoft.z3;
|
|
|
|
/**
|
|
* FloatingPoint Numerals
|
|
*/
|
|
public class FPNum extends FPExpr
|
|
{
|
|
/**
|
|
* Retrieves the sign of a floating-point literal
|
|
* Remarks: returns true if the numeral is negative
|
|
* @throws Z3Exception
|
|
*/
|
|
public boolean getSign() {
|
|
Native.IntPtr res = new Native.IntPtr();
|
|
if (!Native.fpaGetNumeralSign(getContext().nCtx(), getNativeObject(), res))
|
|
throw new Z3Exception("Sign is not a Boolean value");
|
|
return res.value != 0;
|
|
}
|
|
|
|
/**
|
|
* The sign of a floating-point numeral as a bit-vector expression
|
|
* Remarks: NaN's do not have a bit-vector sign, so they are invalid arguments.
|
|
* @throws Z3Exception
|
|
*/
|
|
public BitVecExpr getSignBV() {
|
|
return new BitVecExpr(getContext(), Native.fpaGetNumeralSignBv(getContext().nCtx(), getNativeObject()));
|
|
}
|
|
|
|
/**
|
|
* The significand value of a floating-point numeral as a string
|
|
* Remarks: The significand s is always 0 < s < 2.0; the resulting string is long
|
|
* enough to represent the real significand precisely.
|
|
* @throws Z3Exception
|
|
**/
|
|
public String getSignificand() {
|
|
return Native.fpaGetNumeralSignificandString(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
/**
|
|
* The significand value of a floating-point numeral as a UInt64
|
|
* Remarks: This function extracts the significand bits, without the
|
|
* hidden bit or normalization. Throws an exception if the
|
|
* significand does not fit into a UInt64.
|
|
* @throws Z3Exception
|
|
**/
|
|
public long getSignificandUInt64()
|
|
{
|
|
Native.LongPtr res = new Native.LongPtr();
|
|
if (!Native.fpaGetNumeralSignificandUint64(getContext().nCtx(), getNativeObject(), res))
|
|
throw new Z3Exception("Significand is not a 64 bit unsigned integer");
|
|
return res.value;
|
|
}
|
|
|
|
/**
|
|
* The significand of a floating-point numeral as a bit-vector expression
|
|
* Remarks: NaN is an invalid argument.
|
|
* @throws Z3Exception
|
|
*/
|
|
public BitVecExpr getSignificandBV() {
|
|
return new BitVecExpr(getContext(), Native.fpaGetNumeralSignificandBv(getContext().nCtx(), getNativeObject()));
|
|
}
|
|
|
|
/**
|
|
* Return the exponent value of a floating-point numeral as a string
|
|
* Remarks: NaN is an invalid argument.
|
|
* @throws Z3Exception
|
|
*/
|
|
public String getExponent(boolean biased) {
|
|
return Native.fpaGetNumeralExponentString(getContext().nCtx(), getNativeObject(), biased);
|
|
}
|
|
|
|
/**
|
|
* Return the exponent value of a floating-point numeral as a signed 64-bit integer
|
|
* Remarks: NaN is an invalid argument.
|
|
* @throws Z3Exception
|
|
*/
|
|
public long getExponentInt64(boolean biased) {
|
|
Native.LongPtr res = new Native.LongPtr();
|
|
if (!Native.fpaGetNumeralExponentInt64(getContext().nCtx(), getNativeObject(), res, biased))
|
|
throw new Z3Exception("Exponent is not a 64 bit integer");
|
|
return res.value;
|
|
}
|
|
|
|
/**
|
|
* The exponent of a floating-point numeral as a bit-vector expression
|
|
* Remarks: NaN is an invalid argument.
|
|
* @throws Z3Exception
|
|
*/
|
|
public BitVecExpr getExponentBV(boolean biased) {
|
|
return new BitVecExpr(getContext(), Native.fpaGetNumeralExponentBv(getContext().nCtx(), getNativeObject(), biased));
|
|
}
|
|
|
|
|
|
/**
|
|
* Indicates whether the numeral is a NaN.
|
|
* @throws Z3Exception on error
|
|
* @return a boolean
|
|
**/
|
|
public boolean isNaN()
|
|
{
|
|
return Native.fpaIsNumeralNan(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
/**
|
|
* Indicates whether the numeral is a +oo or -oo.
|
|
* @throws Z3Exception on error
|
|
* @return a boolean
|
|
**/
|
|
public boolean isInf()
|
|
{
|
|
return Native.fpaIsNumeralInf(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
/**
|
|
* Indicates whether the numeral is +zero or -zero.
|
|
* @throws Z3Exception on error
|
|
* @return a boolean
|
|
**/
|
|
public boolean isZero()
|
|
{
|
|
return Native.fpaIsNumeralZero(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
/**
|
|
* Indicates whether the numeral is normal.
|
|
* @throws Z3Exception on error
|
|
* @return a boolean
|
|
**/
|
|
public boolean isNormal()
|
|
{
|
|
return Native.fpaIsNumeralNormal(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
/**
|
|
* Indicates whether the numeral is subnormal.
|
|
* @throws Z3Exception on error
|
|
* @return a boolean
|
|
**/
|
|
public boolean isSubnormal()
|
|
{
|
|
return Native.fpaIsNumeralSubnormal(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
/**
|
|
* Indicates whether the numeral is positive.
|
|
* @throws Z3Exception on error
|
|
* @return a boolean
|
|
**/
|
|
public boolean isPositive()
|
|
{
|
|
return Native.fpaIsNumeralPositive(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
/**
|
|
* Indicates whether the numeral is negative.
|
|
* @throws Z3Exception on error
|
|
* @return a boolean
|
|
**/
|
|
public boolean isNegative()
|
|
{
|
|
return Native.fpaIsNumeralNegative(getContext().nCtx(), getNativeObject());
|
|
}
|
|
|
|
|
|
public FPNum(Context ctx, long obj)
|
|
{
|
|
super(ctx, obj);
|
|
}
|
|
|
|
/**
|
|
* Returns a string representation of the numeral.
|
|
*/
|
|
public String toString()
|
|
{
|
|
return Native.getNumeralString(getContext().nCtx(), getNativeObject());
|
|
}
|
|
}
|