|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--java.lang.Number | +--org.apfloat.Apcomplex | +--org.apfloat.Apfloat
Immutable arbitrary precision floating-point number class.
A pitfall exists with the constructors Apfloat(float,long)
and Apfloat(double,long)
. Since float
s and
double
s are always represented internally in radix 2, the
conversion to any other radix usually causes round-off errors, and the
resulting apfloat won't be accurate to the desired number of digits.
For example, 0.3
can't be presented exactly in base 2. When
you construct an apfloat like new Apfloat(0.3f, 1000)
, the
resulting number won't be accurate to 1000 digits, but only to roughly 7
digits (in radix 10). In fact, the resulting number will be something like
0.30000001192092896
...
Field Summary |
Fields inherited from class org.apfloat.Apcomplex |
DEFAULT, I, INFINITE, ONE, ZERO |
Constructor Summary | |
protected |
Apfloat()
Default constructor. |
protected |
Apfloat(ApfloatImpl impl)
Constructs an apfloat that is backed by the specified ApfloatImpl object. |
|
Apfloat(java.math.BigDecimal value)
Creates and apfloat from a BigDecimal . |
|
Apfloat(java.math.BigDecimal value,
long precision)
Creates and apfloat from a BigDecimal . |
|
Apfloat(java.math.BigInteger value)
Constructs an apfloat from a BigInteger .
|
|
Apfloat(java.math.BigInteger value,
long precision)
Constructs an apfloat from a BigInteger with
the specified precision. |
|
Apfloat(java.math.BigInteger value,
long precision,
int radix)
Constructs an apfloat from a BigInteger with
the specified precision and radix. |
|
Apfloat(double value)
Constructs an apfloat from the specified double .
|
|
Apfloat(double value,
long precision)
Constructs an apfloat from the specified double
and precision. |
|
Apfloat(double value,
long precision,
int radix)
Constructs an apfloat from the specified double ,
precision and radix. |
|
Apfloat(float value)
Constructs an apfloat from the specified float .
|
|
Apfloat(float value,
long precision)
Constructs an apfloat from the specified float
and precision. |
|
Apfloat(float value,
long precision,
int radix)
Constructs an apfloat from the specified float ,
precision and radix. |
|
Apfloat(long value)
Constructs an apfloat from the specified long .
|
|
Apfloat(long value,
long precision)
Constructs an apfloat from the specified long
and precision. |
|
Apfloat(long value,
long precision,
int radix)
Constructs an apfloat from the specified long ,
precision and radix. |
|
Apfloat(java.io.PushbackReader in)
Reads an apfloat from a stream using default precision and radix. |
|
Apfloat(java.io.PushbackReader in,
long precision)
Reads an apfloat from a stream using the specified precision. |
|
Apfloat(java.io.PushbackReader in,
long precision,
int radix)
Reads an apfloat from a stream using the specified precision and radix. |
|
Apfloat(java.lang.String value)
Constructs an apfloat from the specified string. |
|
Apfloat(java.lang.String value,
long precision)
Constructs an apfloat from the specified string and precision. |
|
Apfloat(java.lang.String value,
long precision,
int radix)
Constructs an apfloat from the specified string, precision and radix. |
Method Summary | |
Apfloat |
add(Apfloat x)
Adds two apfloats. |
byte |
byteValue()
Returns the value of the this number as a byte .
|
Apint |
ceil()
Ceiling function. |
int |
compareTo(Apfloat x)
Compare this apfloat to the specified apfloat. |
int |
compareTo(java.lang.Object obj)
Compare this apfloat to the specified object. |
Apfloat |
divide(Apfloat x)
Divides two apfloats. |
double |
doubleValue()
Returns the value of the this number as a double .
|
long |
equalDigits(Apfloat x)
Computes number of equal digits. |
boolean |
equals(java.lang.Object obj)
Compares this object to the specified object. |
float |
floatValue()
Returns the value of the this number as a float .
|
Apint |
floor()
Floor function. |
protected ApfloatImpl |
getImpl(long precision)
Returns an ApfloatImpl representing the actual instance
of this apfloat up to the requested precision. |
int |
hashCode()
Returns a hash code for this apfloat. |
Apfloat |
imag()
Imaginary part of this apfloat. |
int |
intValue()
Returns the value of the this number as an int .
|
boolean |
isShort()
Returns if this apfloat is "short". |
long |
longValue()
Returns the value of the this number as a long .
|
Apfloat |
multiply(Apfloat x)
Multiplies two apfloats. |
long |
precision()
Returns the precision of this apfloat. |
Apfloat |
precision(long precision)
Returns an apfloat with the same value as this apfloat accurate to the specified precision. |
int |
radix()
Radix of this apfloat. |
Apfloat |
real()
Real part of this apfloat. |
long |
scale()
Returns the scale of this apfloat. |
short |
shortValue()
Returns the value of the this number as a short .
|
int |
signum()
Returns the signum function of this apfloat. |
Apfloat |
subtract(Apfloat x)
Subtracts two apfloats. |
java.lang.String |
toString(boolean pretty)
Returns a string representation of this apfloat. |
Apint |
truncate()
Truncates fractional part. |
void |
writeTo(java.io.Writer out,
boolean pretty)
Write a string representation of this apfloat to a Writer. |
Methods inherited from class org.apfloat.Apcomplex |
add, conj, divide, equalDigits, multiply, subtract, toString, writeTo |
Methods inherited from class java.lang.Object |
clone, finalize, getClass, notify, notifyAll, wait, wait, wait |
Constructor Detail |
protected Apfloat()
protected Apfloat(ApfloatImpl impl)
impl
- The ApfloatImpl object backing this apfloat.public Apfloat(java.lang.String value) throws java.lang.NumberFormatException, ApfloatRuntimeException
The precision will be calculated from the number of digits specified in the string. For example:
"0.1"
will have a precision of 1 digit.
"1.0"
will have a precision of 2 digits.
"100"
will have a precision of 3 digits.
value
- The string representing the number.
java.lang.NumberFormatException
- In case the number is invalid.
ApfloatRuntimeException
public Apfloat(java.lang.String value, long precision) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
value
- The string representing the number.precision
- The precision of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(java.lang.String value, long precision, int radix) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
Note that it's impossible to construct apfloats with a specified exponent and with radix >= 14, since the character 'e' and 'E' will be treated as digits of the mantissa.
For example, in radix 10, "1e5" means the decimal number 100000. But in radix 16, "1e5" means the decimal number 485.
value
- The string representing the number.precision
- The precision of the number.radix
- The radix of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(long value) throws java.lang.NumberFormatException, ApfloatRuntimeException
long
.
The default radix will be used. The precision of the number
will be Apcomplex.INFINITE
.
value
- The value of the number.
java.lang.NumberFormatException
- In case the number is invalid.
ApfloatRuntimeException
public Apfloat(long value, long precision) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
long
and precision. The default radix will be used.
value
- The value of the number.precision
- The precision of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(long value, long precision, int radix) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
long
,
precision and radix.
value
- The value of the number.precision
- The precision of the number.radix
- The radix of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(float value) throws java.lang.NumberFormatException, ApfloatRuntimeException
float
.
The default radix will be used. The precision of the number
will be the precision of a float
in the default
radix, for example in radix 10 the precision is 7 digits.
value
- The value of the number.
java.lang.NumberFormatException
- In case the number is invalid.
ApfloatRuntimeException
public Apfloat(float value, long precision) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
float
and precision. The default radix will be used.
value
- The value of the number.precision
- The precision of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(float value, long precision, int radix) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
float
,
precision and radix.
value
- The value of the number.precision
- The precision of the number.radix
- The radix of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(double value) throws java.lang.NumberFormatException, ApfloatRuntimeException
double
.
The default radix will be used. The precision of the number
will be the precision of a double
in the default
radix, for example in radix 10 the precision is 16 digits.
value
- The value of the number.
java.lang.NumberFormatException
- In case the number is invalid.
ApfloatRuntimeException
public Apfloat(double value, long precision) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
double
and precision. The default radix will be used.
value
- The value of the number.precision
- The precision of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(double value, long precision, int radix) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
double
,
precision and radix.
value
- The value of the number.precision
- The precision of the number.radix
- The radix of the number.
java.lang.NumberFormatException
- In case the number is invalid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(java.io.PushbackReader in) throws java.io.IOException, java.lang.NumberFormatException, ApfloatRuntimeException
PushbackReader
,
as the first invalid character is pushed back to the stream.
Note that since only a pushback buffer of one character is used,
the number read may still not be valid. For example, if the stream
contains "-#"
or "1.5e#"
(here '#'
is the first invalid character), the number is actually not valid, and
only the character '#'
would be put back to the stream.
The precision is determined similarly as in the Apfloat(String)
constructor that is as the number of digits read from the stream.
in
- The stream to read from
java.io.IOException
- If an I/O error occurs accessing the stream.
java.lang.NumberFormatException
- If the number is not valid.
ApfloatRuntimeException
public Apfloat(java.io.PushbackReader in, long precision) throws java.io.IOException, java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
in
- The stream to read fromprecision
- The precision of the number.
java.io.IOException
- If an I/O error occurs accessing the stream.
java.lang.NumberFormatException
- If the number is not valid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
Apfloat(PushbackReader)
public Apfloat(java.io.PushbackReader in, long precision, int radix) throws java.io.IOException, java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
in
- The stream to read fromprecision
- The precision of the number.radix
- The radix of the number.
java.io.IOException
- If an I/O error occurs accessing the stream.
java.lang.NumberFormatException
- If the number is not valid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
Apfloat(PushbackReader)
public Apfloat(java.math.BigInteger value) throws java.lang.NumberFormatException, ApfloatRuntimeException
BigInteger
.
Precision will be Apcomplex.INFINITE
and the default radix
is used.
value
- The value of the number.
java.lang.NumberFormatException
- If the default radix is not valid.
ApfloatRuntimeException
public Apfloat(java.math.BigInteger value, long precision) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
BigInteger
with
the specified precision. The default radix is used.
value
- The value of the number.precision
- The precision of the number.
java.lang.NumberFormatException
- If the default radix is not valid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(java.math.BigInteger value, long precision, int radix) throws java.lang.NumberFormatException, java.lang.IllegalArgumentException, ApfloatRuntimeException
BigInteger
with
the specified precision and radix.
value
- The value of the number.precision
- The precision of the number.
java.lang.NumberFormatException
- If the radix is not valid.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
public Apfloat(java.math.BigDecimal value) throws ApfloatRuntimeException
BigDecimal
. An apfloat created this
way will always have radix 10 regardless of the current default radix.
value
- The value to use.public Apfloat(java.math.BigDecimal value, long precision) throws java.lang.IllegalArgumentException, ApfloatRuntimeException
BigDecimal
. An apfloat created this
way will always have radix 10 regardless of the current default radix.
value
- The value to use.precision
- The precision to use, in decimal digits.
java.lang.IllegalArgumentException
- In case the precision is invalid.
ApfloatRuntimeException
Method Detail |
public int radix()
radix
in class Apcomplex
public Apfloat real()
real
in class Apcomplex
this
public Apfloat imag()
imag
in class Apcomplex
Apcomplex.ZERO
public long precision() throws ApfloatRuntimeException
precision
in class Apcomplex
ApfloatRuntimeException
public Apfloat precision(long precision) throws java.lang.IllegalArgumentException, ApfloatRuntimeException
If the requested precision less than this number's current precision, the functionality is quite obvious: the precision is simply truncated, and e.g. comparison and equality checking will work as expected. Some rounding errors in e.g. addition and subtraction may still occur, as "invisible" trailing digits can remain in the number.
If the requested precision more than this number's current precision, the functionality is quite undefined: the digits up to this number's current precision are guaranteed to be the same, but the "new" digits are undefined: they may be zero, or they may be digits that have been previously discarded with a call to precision() with a smaller number of digits, or they may be something else, or any combination of these.
These limitations allow various performance optimizations to be made.
precision
- Precision of the new apfloat.
java.lang.IllegalArgumentException
- If precision
is <= 0.
ApfloatRuntimeException
public long scale() throws ApfloatRuntimeException
apfloat = mantissa * radixscale
where 1/radix <= mantissa < 1. In other words,
scale = floor(logradix(apfloat) + 1
.
For example, 1 has a scale of 1, and 100 has a scale of 3 (in radix 10). For integers, scale is equal to the number of digits in the apfloat.
Zero has a scale of -INFINITE
.
Note that this definition of scale
is different than in java.util.BigDecimal
.
scale
in class Apcomplex
ApfloatRuntimeException
scale()
public int signum()
public boolean isShort() throws ApfloatRuntimeException
For example, division by a "short" apfloat requires only a single pass through the data, but that algorithm can't be used for divisors that aren't "short", where calculating an inverse root is required instead.
The return value of this method is implementation dependent.
true
if the apfloat is "short", false
if not.
ApfloatRuntimeException
public Apfloat add(Apfloat x) throws ApfloatRuntimeException
x
- The number to be added to this number.
this + x
.
ApfloatRuntimeException
public Apfloat subtract(Apfloat x) throws ApfloatRuntimeException
x
- The number to be subtracted from this number.
this - x
.
ApfloatRuntimeException
public Apfloat multiply(Apfloat x) throws ApfloatRuntimeException
x
- The number to be multiplied by this number.
this * x
.
ApfloatRuntimeException
public Apfloat divide(Apfloat x) throws java.lang.ArithmeticException, ApfloatRuntimeException
x
- The number by which this number is to be divided.
this / x
.
java.lang.ArithmeticException
- In case the divisor is zero.
ApfloatRuntimeException
public Apint floor() throws ApfloatRuntimeException
ApfloatRuntimeException
public Apint ceil() throws ApfloatRuntimeException
ApfloatRuntimeException
public Apint truncate() throws ApfloatRuntimeException
ApfloatRuntimeException
public double doubleValue()
double
.
If the number is too big to fit in a double
,
Double.POSITIVE_INFINITY
or
Double.NEGATIVE_INFINITY
is returned.
doubleValue
in class Apcomplex
double
.doubleValue()
public float floatValue()
float
.
If the number is too big to fit in a float
,
Float.POSITIVE_INFINITY
or
Float.NEGATIVE_INFINITY
is returned.
floatValue
in class Apcomplex
float
.floatValue()
public byte byteValue()
byte
.
If the number is too big to fit in a byte
,
Byte.MIN_VALUE
or
Byte.MAX_VALUE
is returned.
byteValue
in class Apcomplex
byte
.byteValue()
public short shortValue()
short
.
If the number is too big to fit in a short
,
Short.MIN_VALUE
or
Short.MAX_VALUE
is returned.
shortValue
in class Apcomplex
short
.shortValue()
public int intValue()
int
.
If the number is too big to fit in an int
,
Integer.MIN_VALUE
or
Integer.MAX_VALUE
is returned.
intValue
in class Apcomplex
int
.intValue()
public long longValue()
long
.
If the number is too big to fit in a long
,
Long.MIN_VALUE
or
Long.MAX_VALUE
is returned.
longValue
in class Apcomplex
long
.longValue()
public long equalDigits(Apfloat x) throws ApfloatRuntimeException
Compares the digits of the numbers starting from the most significant digits. The exponent and sign are taken into consideration, so if either one doesn't match, the numbers are considered to have zero equal digits.
For example, the numbers 12345 and 123456 have zero matching digits, and the numbers 12345 and 12355 have three matching digits.
The result of this method is roughly equal to
Math.min(scale(), x.scale()) - subtract(x).scale()
but it typically is a lot more efficient to execute.
x
- Number to compare with.
ApfloatRuntimeException
public int compareTo(Apfloat x) throws ApfloatRuntimeException
Note: if two apfloats are compared where one number doesn't have enough precise digits, the mantissa is assumed to contain zeros. For example:
Apfloat x = new Apfloat("0.12", 2); Apfloat y = new Apfloat("0.12345", 5);Now
x.compareTo(y) < 0
because x
is assumed to
be 0.12000
.
However, new Apfloat("0.12", 2)
and new Apfloat("0.12", 5)
would be considered equal.
x
- Apfloat to which this apfloat is to be compared.
x
.
ApfloatRuntimeException
public int compareTo(java.lang.Object obj) throws java.lang.ClassCastException
Note: if two apfloats are compared where one number doesn't have enough
precise digits, the mantissa is assumed to contain zeros.
See compareTo(Apfloat)
.
compareTo
in interface java.lang.Comparable
obj
- Object to which this apfloat is to be compared.
obj
.
java.lang.ClassCastException
- If the specified object is not an apfloat.public boolean equals(java.lang.Object obj)
Note: if two apfloats are compared where one number doesn't have enough
precise digits, the mantissa is assumed to contain zeros.
See compareTo(Apfloat)
.
equals
in class Apcomplex
obj
- The object to compare with.
true
if the objects are equal; false
otherwise.public int hashCode()
hashCode
in class Apcomplex
public java.lang.String toString(boolean pretty) throws ApfloatRuntimeException
toString
in class Apcomplex
pretty
- true
to use a fixed-point notation, false
to use an exponential notation.
ApfloatRuntimeException
public void writeTo(java.io.Writer out, boolean pretty) throws java.io.IOException, ApfloatRuntimeException
writeTo
in class Apcomplex
out
- The output Writer.pretty
- true
to use a fixed-point notation, false
to use an exponential notation.
java.io.IOException
- In case of I/O error writing to the stream.
ApfloatRuntimeException
protected ApfloatImpl getImpl(long precision) throws ApfloatRuntimeException
ApfloatImpl
representing the actual instance
of this apfloat up to the requested precision.
For apfloats this is simply the underlying ApfloatImpl
,
but e.g. the Aprational
class implements this so that
it only returns an approximation of the rational number.
precision
- Precision of the ApfloatImpl
that is needed.
ApfloatImpl
representing this object to the requested precision.
ApfloatRuntimeException
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |