Browse Source

refactor: TypeDouble expressions may evaluate to BigRational, add proper casts

This allows storage of BigRational values in StateValues / Values vectors, e.g.,
to store constants that have been evaluated exactly.

TypeDouble.castValueTo now returns a Number instead of a Double, requiring the use
of the doubleValue() method in several places where the value is evaluated using
double arithmetic.
master
Joachim Klein 8 years ago
committed by Dave Parker
parent
commit
4d1ddc008f
  1. 2
      prism/src/explicit/StateValues.java
  2. 2
      prism/src/parser/Values.java
  3. 3
      prism/src/parser/ast/Expression.java
  4. 5
      prism/src/parser/type/TypeDouble.java

2
prism/src/explicit/StateValues.java

@ -139,7 +139,7 @@ public class StateValues implements StateVector
valuesI[i] = initI;
} else if (type instanceof TypeDouble) {
valuesD = new double[size];
Double objD = ((TypeDouble) type).castValueTo(init);
Double objD = ((TypeDouble) type).castValueTo(init).doubleValue();
double initD = objD.doubleValue();
for (i = 0; i < size; i++)
valuesD[i] = initD;

2
prism/src/parser/Values.java

@ -28,6 +28,7 @@ package parser;
import java.util.ArrayList;
import param.BigRational;
import parser.type.Type;
import parser.type.TypeBool;
import parser.type.TypeDouble;
@ -220,6 +221,7 @@ public class Values implements Cloneable //implements Comparable
Object o = values.get(i);
if (o instanceof Integer) return TypeInt.getInstance();
if (o instanceof Double) return TypeDouble.getInstance();
if (o instanceof BigRational) return TypeDouble.getInstance();
if (o instanceof Boolean) return TypeBool.getInstance();
else return null;
}

3
prism/src/parser/ast/Expression.java

@ -355,6 +355,9 @@ public abstract class Expression extends ASTElement
if (o instanceof Double) {
return ((Double) o).doubleValue();
}
if (o instanceof BigRational) {
return ((BigRational)o).doubleValue();
}
if (o instanceof Boolean) {
return ((Boolean) o).booleanValue() ? 1.0 : 0.0;
}

5
prism/src/parser/type/TypeDouble.java

@ -26,6 +26,7 @@
package parser.type;
import param.BigRational;
import prism.PrismLangException;
public class TypeDouble extends Type
@ -70,10 +71,12 @@ public class TypeDouble extends Type
}
@Override
public Double castValueTo(Object value) throws PrismLangException
public Number castValueTo(Object value) throws PrismLangException
{
if (value instanceof Double)
return (Double) value;
if (value instanceof BigRational)
return (BigRational) value;
if (value instanceof Integer)
return new Double(((Integer) value).intValue());
else

Loading…
Cancel
Save