All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.commons.math3.dfp.package-info Maven / Gradle / Ivy

There is a newer version: 5.0.70
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 *
 * Decimal floating point library for Java
 *
 * 

Another floating point class. This one is built using radix 10000 * which is 104, so its almost decimal.

* *

The design goals here are: *

    *
  1. Decimal math, or close to it
  2. *
  3. Settable precision (but no mix between numbers using different settings)
  4. *
  5. Portability. Code should be keep as portable as possible.
  6. *
  7. Performance
  8. *
  9. Accuracy - Results should always be +/- 1 ULP for basic * algebraic operation
  10. *
  11. Comply with IEEE 854-1987 as much as possible. * (See IEEE 854-1987 notes below)
  12. *

* *

Trade offs: *

    *
  1. Memory foot print. I'm using more memory than necessary to * represent numbers to get better performance.
  2. *
  3. Digits are bigger, so rounding is a greater loss. So, if you * really need 12 decimal digits, better use 4 base 10000 digits * there can be one partially filled.
  4. *

* *

Numbers are represented in the following form: *

 * n  =  sign × mant × (radix)exp;

*
* where sign is ±1, mantissa represents a fractional number between * zero and one. mant[0] is the least significant digit. * exp is in the range of -32767 to 32768

* *

IEEE 854-1987 Notes and differences

* *

IEEE 854 requires the radix to be either 2 or 10. The radix here is * 10000, so that requirement is not met, but it is possible that a * subclassed can be made to make it behave as a radix 10 * number. It is my opinion that if it looks and behaves as a radix * 10 number then it is one and that requirement would be met.

* *

The radix of 10000 was chosen because it should be faster to operate * on 4 decimal digits at once instead of one at a time. Radix 10 behavior * can be realized by add an additional rounding step to ensure that * the number of decimal digits represented is constant.

* *

The IEEE standard specifically leaves out internal data encoding, * so it is reasonable to conclude that such a subclass of this radix * 10000 system is merely an encoding of a radix 10 system.

* *

IEEE 854 also specifies the existence of "sub-normal" numbers. This * class does not contain any such entities. The most significant radix * 10000 digit is always non-zero. Instead, we support "gradual underflow" * by raising the underflow flag for numbers less with exponent less than * expMin, but don't flush to zero until the exponent reaches MIN_EXP-digits. * Thus the smallest number we can represent would be: * 1E(-(MIN_EXP-digits-1)∗4), eg, for digits=5, MIN_EXP=-32767, that would * be 1e-131092.

* *

IEEE 854 defines that the implied radix point lies just to the right * of the most significant digit and to the left of the remaining digits. * This implementation puts the implied radix point to the left of all * digits including the most significant one. The most significant digit * here is the one just to the right of the radix point. This is a fine * detail and is really only a matter of definition. Any side effects of * this can be rendered invisible by a subclass.

* */ package org.apache.commons.math3.dfp;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy