Binary64.java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * The ASF licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *      https://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. /*
  18.  * This is not the original file distributed by the Apache Software Foundation
  19.  * It has been modified by the Hipparchus project
  20.  */
  21. package org.hipparchus.util;

  22. import org.hipparchus.CalculusFieldElement;
  23. import org.hipparchus.Field;
  24. import org.hipparchus.exception.MathIllegalArgumentException;

  25. /**
  26.  * This class wraps a {@code double} value in an object. It is similar to the
  27.  * standard class {@link Double}, while also implementing the
  28.  * {@link CalculusFieldElement} interface.
  29.  */
  30. public class Binary64 extends Number implements CalculusFieldElement<Binary64>, Comparable<Binary64> {

  31.     /** The constant value of {@code 0d} as a {@code Binary64}. */
  32.     public static final Binary64 ZERO;

  33.     /** The constant value of {@code 1d} as a {@code Binary64}. */
  34.     public static final Binary64 ONE;

  35.     /** The constant value of π as a {@code Binary64}. */
  36.     public static final Binary64 PI;

  37.     /**
  38.      * The constant value of {@link Double#NEGATIVE_INFINITY} as a
  39.      * {@code Binary64}.
  40.      */
  41.     public static final Binary64 NEGATIVE_INFINITY;

  42.     /**
  43.      * The constant value of {@link Double#POSITIVE_INFINITY} as a
  44.      * {@code Binary64}.
  45.      */
  46.     public static final Binary64 POSITIVE_INFINITY;

  47.     /** The constant value of {@link Double#NaN} as a {@code Binary64}. */
  48.     public static final Binary64 NAN;

  49.     /** */
  50.     private static final long serialVersionUID = 20120227L;

  51.     static {
  52.         ZERO = new Binary64(0d);
  53.         ONE  = new Binary64(1d);
  54.         PI   = new Binary64(FastMath.PI);
  55.         NEGATIVE_INFINITY = new Binary64(Double.NEGATIVE_INFINITY);
  56.         POSITIVE_INFINITY = new Binary64(Double.POSITIVE_INFINITY);
  57.         NAN = new Binary64(Double.NaN);
  58.     }

  59.     /** The primitive {@code double} value of this object. */
  60.     private final double value;

  61.     /**
  62.      * Creates a new instance of this class.
  63.      *
  64.      * @param x the primitive {@code double} value of the object to be created
  65.      */
  66.     public Binary64(final double x) {
  67.         this.value = x;
  68.     }

  69.     /*
  70.      * Methods from the FieldElement interface.
  71.      */

  72.     /** {@inheritDoc} */
  73.     @Override
  74.     public Binary64 newInstance(final double v) {
  75.         return new Binary64(v);
  76.     }

  77.     /** {@inheritDoc} */
  78.     @Override
  79.     public Field<Binary64> getField() {
  80.         return Binary64Field.getInstance();
  81.     }

  82.     /**
  83.      * {@inheritDoc}
  84.      *
  85.      * The current implementation strictly enforces
  86.      * {@code this.add(a).equals(new Binary64(this.doubleValue()
  87.      * + a.doubleValue()))}.
  88.      */
  89.     @Override
  90.     public Binary64 add(final Binary64 a) {
  91.         return new Binary64(this.value + a.value);
  92.     }

  93.     /**
  94.      * {@inheritDoc}
  95.      *
  96.      * The current implementation strictly enforces
  97.      * {@code this.subtract(a).equals(new Binary64(this.doubleValue()
  98.      * - a.doubleValue()))}.
  99.      */
  100.     @Override
  101.     public Binary64 subtract(final Binary64 a) {
  102.         return new Binary64(this.value - a.value);
  103.     }

  104.     /**
  105.      * {@inheritDoc}
  106.      *
  107.      * The current implementation strictly enforces
  108.      * {@code this.negate().equals(new Binary64(-this.doubleValue()))}.
  109.      */
  110.     @Override
  111.     public Binary64 negate() {
  112.         return new Binary64(-this.value);
  113.     }

  114.     @Override
  115.     public Binary64 square() {
  116.         return multiply(this);
  117.     }

  118.     /**
  119.      * {@inheritDoc}
  120.      *
  121.      * The current implementation strictly enforces
  122.      * {@code this.multiply(a).equals(new Binary64(this.doubleValue()
  123.      * * a.doubleValue()))}.
  124.      */
  125.     @Override
  126.     public Binary64 multiply(final Binary64 a) {
  127.         return new Binary64(this.value * a.value);
  128.     }

  129.     /**
  130.      * {@inheritDoc}
  131.      *
  132.      * The current implementation strictly enforces
  133.      * {@code this.multiply(n).equals(new Binary64(n * this.doubleValue()))}.
  134.      */
  135.     @Override
  136.     public Binary64 multiply(final int n) {
  137.         return new Binary64(n * this.value);
  138.     }

  139.     /**
  140.      * {@inheritDoc}
  141.      *
  142.      * The current implementation strictly enforces
  143.      * {@code this.divide(a).equals(new Binary64(this.doubleValue()
  144.      * / a.doubleValue()))}.
  145.      *
  146.      */
  147.     @Override
  148.     public Binary64 divide(final Binary64 a) {
  149.         return new Binary64(this.value / a.value);
  150.     }

  151.     /**
  152.      * {@inheritDoc}
  153.      *
  154.      * The current implementation strictly enforces
  155.      * {@code this.reciprocal().equals(new Binary64(1.0
  156.      * / this.doubleValue()))}.
  157.      */
  158.     @Override
  159.     public Binary64 reciprocal() {
  160.         return new Binary64(1.0 / this.value);
  161.     }

  162.     /*
  163.      * Methods from the Number abstract class
  164.      */

  165.     /**
  166.      * {@inheritDoc}
  167.      *
  168.      * The current implementation performs casting to a {@code byte}.
  169.      */
  170.     @Override
  171.     public byte byteValue() {
  172.         return (byte) value;
  173.     }

  174.     /**
  175.      * {@inheritDoc}
  176.      *
  177.      * The current implementation performs casting to a {@code short}.
  178.      */
  179.     @Override
  180.     public short shortValue() {
  181.         return (short) value;
  182.     }

  183.     /**
  184.      * {@inheritDoc}
  185.      *
  186.      * The current implementation performs casting to a {@code int}.
  187.      */
  188.     @Override
  189.     public int intValue() {
  190.         return (int) value;
  191.     }

  192.     /**
  193.      * {@inheritDoc}
  194.      *
  195.      * The current implementation performs casting to a {@code long}.
  196.      */
  197.     @Override
  198.     public long longValue() {
  199.         return (long) value;
  200.     }

  201.     /**
  202.      * {@inheritDoc}
  203.      *
  204.      * The current implementation performs casting to a {@code float}.
  205.      */
  206.     @Override
  207.     public float floatValue() {
  208.         return (float) value;
  209.     }

  210.     /** {@inheritDoc} */
  211.     @Override
  212.     public double doubleValue() {
  213.         return value;
  214.     }

  215.     /*
  216.      * Methods from the Comparable interface.
  217.      */

  218.     /**
  219.      * {@inheritDoc}
  220.      *
  221.      * The current implementation returns the same value as
  222.      * {@code new Double(this.doubleValue()).compareTo(new
  223.      * Double(o.doubleValue()))}
  224.      *
  225.      * @see Double#compareTo(Double)
  226.      */
  227.     @Override
  228.     public int compareTo(final Binary64 o) {
  229.         return Double.compare(this.value, o.value);
  230.     }

  231.     /*
  232.      * Methods from the Object abstract class.
  233.      */

  234.     /** {@inheritDoc} */
  235.     @Override
  236.     public boolean equals(final Object obj) {
  237.         if (obj instanceof Binary64) {
  238.             final Binary64 that = (Binary64) obj;
  239.             return Double.doubleToLongBits(this.value) == Double
  240.                     .doubleToLongBits(that.value);
  241.         }
  242.         return false;
  243.     }

  244.     /** {@inheritDoc}
  245.      * <p>
  246.      * This implementation considers +0.0 and -0.0 to be equal.
  247.      * </p>
  248.      * @since 1.8
  249.      */
  250.     @Override
  251.     public boolean isZero() {
  252.         return value == 0.0;
  253.     }

  254.     /**
  255.      * {@inheritDoc}
  256.      *
  257.      * The current implementation returns the same value as
  258.      * {@code new Double(this.doubleValue()).hashCode()}
  259.      *
  260.      * @see Double#hashCode()
  261.      */
  262.     @Override
  263.     public int hashCode() {
  264.         long v = Double.doubleToLongBits(value);
  265.         return (int) (v ^ (v >>> 32));
  266.     }

  267.     /**
  268.      * {@inheritDoc}
  269.      *
  270.      * The returned {@code String} is equal to
  271.      * {@code Double.toString(this.doubleValue())}
  272.      *
  273.      * @see Double#toString(double)
  274.      */
  275.     @Override
  276.     public String toString() {
  277.         return Double.toString(value);
  278.     }

  279.     /*
  280.      * Methods inspired by the Double class.
  281.      */

  282.     /**
  283.      * Returns {@code true} if {@code this} double precision number is infinite
  284.      * ({@link Double#POSITIVE_INFINITY} or {@link Double#NEGATIVE_INFINITY}).
  285.      *
  286.      * @return {@code true} if {@code this} number is infinite
  287.      */
  288.     @Override
  289.     public boolean isInfinite() {
  290.         return Double.isInfinite(value);
  291.     }

  292.     /**
  293.      * Returns {@code true} if {@code this} double precision number is
  294.      * Not-a-Number ({@code NaN}), false otherwise.
  295.      *
  296.      * @return {@code true} if {@code this} is {@code NaN}
  297.      */
  298.     @Override
  299.     public boolean isNaN() {
  300.         return Double.isNaN(value);
  301.     }

  302.     /** {@inheritDoc} */
  303.     @Override
  304.     public double getReal() {
  305.         return value;
  306.     }

  307.     /** {@inheritDoc} */
  308.     @Override
  309.     public Binary64 getAddendum() {
  310.         return ZERO;
  311.     }

  312.     /** {@inheritDoc} */
  313.     @Override
  314.     public Binary64 add(final double a) {
  315.         return new Binary64(value + a);
  316.     }

  317.     /** {@inheritDoc} */
  318.     @Override
  319.     public Binary64 subtract(final double a) {
  320.         return new Binary64(value - a);
  321.     }

  322.     /** {@inheritDoc} */
  323.     @Override
  324.     public Binary64 multiply(final double a) {
  325.         return new Binary64(value * a);
  326.     }

  327.     /** {@inheritDoc} */
  328.     @Override
  329.     public Binary64 divide(final double a) {
  330.         return new Binary64(value / a);
  331.     }

  332.     /** {@inheritDoc} */
  333.     @Override
  334.     public Binary64 remainder(final double a) {
  335.         return new Binary64(FastMath.IEEEremainder(value, a));
  336.     }

  337.     /** {@inheritDoc} */
  338.     @Override
  339.     public Binary64 remainder(final Binary64 a) {
  340.         return new Binary64(FastMath.IEEEremainder(value, a.value));
  341.     }

  342.     /** {@inheritDoc} */
  343.     @Override
  344.     public Binary64 abs() {
  345.         return new Binary64(FastMath.abs(value));
  346.     }

  347.     /** {@inheritDoc} */
  348.     @Override
  349.     public Binary64 ceil() {
  350.         return new Binary64(FastMath.ceil(value));
  351.     }

  352.     /** {@inheritDoc} */
  353.     @Override
  354.     public Binary64 floor() {
  355.         return new Binary64(FastMath.floor(value));
  356.     }

  357.     /** {@inheritDoc} */
  358.     @Override
  359.     public Binary64 rint() {
  360.         return new Binary64(FastMath.rint(value));
  361.     }

  362.     /** {@inheritDoc} */
  363.     @Override
  364.     public Binary64 sign() {
  365.         return new Binary64(FastMath.signum(value));
  366.     }

  367.     /** {@inheritDoc} */
  368.     @Override
  369.     public Binary64 copySign(final Binary64 sign) {
  370.         return new Binary64(FastMath.copySign(value, sign.value));
  371.     }

  372.     /** {@inheritDoc} */
  373.     @Override
  374.     public Binary64 copySign(final double sign) {
  375.         return new Binary64(FastMath.copySign(value, sign));
  376.     }

  377.     /** {@inheritDoc} */
  378.     @Override
  379.     public Binary64 scalb(final int n) {
  380.         return new Binary64(FastMath.scalb(value, n));
  381.     }

  382.     /** {@inheritDoc} */
  383.     @Override
  384.     public Binary64 ulp() {
  385.         return new Binary64(FastMath.ulp(value));
  386.     }

  387.     /** {@inheritDoc} */
  388.     @Override
  389.     public Binary64 hypot(final Binary64 y) {
  390.         return new Binary64(FastMath.hypot(value, y.value));
  391.     }

  392.     /** {@inheritDoc} */
  393.     @Override
  394.     public Binary64 sqrt() {
  395.         return new Binary64(FastMath.sqrt(value));
  396.     }

  397.     /** {@inheritDoc} */
  398.     @Override
  399.     public Binary64 cbrt() {
  400.         return new Binary64(FastMath.cbrt(value));
  401.     }

  402.     /** {@inheritDoc} */
  403.     @Override
  404.     public Binary64 rootN(final int n) {
  405.         if (value < 0) {
  406.             return (n % 2 == 0) ? NAN : new Binary64(-FastMath.pow(-value, 1.0 / n));
  407.         } else {
  408.             return new Binary64(FastMath.pow(value, 1.0 / n));
  409.         }
  410.     }

  411.     /** {@inheritDoc} */
  412.     @Override
  413.     public Binary64 pow(final double p) {
  414.         return new Binary64(FastMath.pow(value, p));
  415.     }

  416.     /** {@inheritDoc} */
  417.     @Override
  418.     public Binary64 pow(final int n) {
  419.         return new Binary64(FastMath.pow(value, n));
  420.     }

  421.     /** {@inheritDoc} */
  422.     @Override
  423.     public Binary64 pow(final Binary64 e) {
  424.         return new Binary64(FastMath.pow(value, e.value));
  425.     }

  426.     /** {@inheritDoc} */
  427.     @Override
  428.     public Binary64 exp() {
  429.         return new Binary64(FastMath.exp(value));
  430.     }

  431.     /** {@inheritDoc} */
  432.     @Override
  433.     public Binary64 expm1() {
  434.         return new Binary64(FastMath.expm1(value));
  435.     }

  436.     /** {@inheritDoc} */
  437.     @Override
  438.     public Binary64 log() {
  439.         return new Binary64(FastMath.log(value));
  440.     }

  441.     /** {@inheritDoc} */
  442.     @Override
  443.     public Binary64 log1p() {
  444.         return new Binary64(FastMath.log1p(value));
  445.     }

  446.     /** Base 10 logarithm.
  447.      * @return base 10 logarithm of the instance
  448.      */
  449.     @Override
  450.     public Binary64 log10() {
  451.         return new Binary64(FastMath.log10(value));
  452.     }

  453.     /** {@inheritDoc} */
  454.     @Override
  455.     public Binary64 cos() {
  456.         return new Binary64(FastMath.cos(value));
  457.     }

  458.     /** {@inheritDoc} */
  459.     @Override
  460.     public Binary64 sin() {
  461.         return new Binary64(FastMath.sin(value));
  462.     }

  463.     /** {@inheritDoc} */
  464.     @Override
  465.     public FieldSinCos<Binary64> sinCos() {
  466.         final SinCos sc = FastMath.sinCos(value);
  467.         return new FieldSinCos<>(new Binary64(sc.sin()), new Binary64(sc.cos()));
  468.     }

  469.     /** {@inheritDoc} */
  470.     @Override
  471.     public Binary64 tan() {
  472.         return new Binary64(FastMath.tan(value));
  473.     }

  474.     /** {@inheritDoc} */
  475.     @Override
  476.     public Binary64 acos() {
  477.         return new Binary64(FastMath.acos(value));
  478.     }

  479.     /** {@inheritDoc} */
  480.     @Override
  481.     public Binary64 asin() {
  482.         return new Binary64(FastMath.asin(value));
  483.     }

  484.     /** {@inheritDoc} */
  485.     @Override
  486.     public Binary64 atan() {
  487.         return new Binary64(FastMath.atan(value));
  488.     }

  489.     /** {@inheritDoc} */
  490.     @Override
  491.     public Binary64 atan2(final Binary64 x) {
  492.         return new Binary64(FastMath.atan2(value, x.value));
  493.     }

  494.     /** {@inheritDoc} */
  495.     @Override
  496.     public Binary64 cosh() {
  497.         return new Binary64(FastMath.cosh(value));
  498.     }

  499.     /** {@inheritDoc} */
  500.     @Override
  501.     public Binary64 sinh() {
  502.         return new Binary64(FastMath.sinh(value));
  503.     }

  504.     /** {@inheritDoc} */
  505.     @Override
  506.     public FieldSinhCosh<Binary64> sinhCosh() {
  507.         final SinhCosh sch = FastMath.sinhCosh(value);
  508.         return new FieldSinhCosh<>(new Binary64(sch.sinh()), new Binary64(sch.cosh()));
  509.     }

  510.     /** {@inheritDoc} */
  511.     @Override
  512.     public Binary64 tanh() {
  513.         return new Binary64(FastMath.tanh(value));
  514.     }

  515.     /** {@inheritDoc} */
  516.     @Override
  517.     public Binary64 acosh() {
  518.         return new Binary64(FastMath.acosh(value));
  519.     }

  520.     /** {@inheritDoc} */
  521.     @Override
  522.     public Binary64 asinh() {
  523.         return new Binary64(FastMath.asinh(value));
  524.     }

  525.     /** {@inheritDoc} */
  526.     @Override
  527.     public Binary64 atanh() {
  528.         return new Binary64(FastMath.atanh(value));
  529.     }

  530.     /** {@inheritDoc} */
  531.     @Override
  532.     public Binary64 toDegrees() {
  533.         return new Binary64(FastMath.toDegrees(value));
  534.     }

  535.     /** {@inheritDoc} */
  536.     @Override
  537.     public Binary64 toRadians() {
  538.         return new Binary64(FastMath.toRadians(value));
  539.     }

  540.     /** {@inheritDoc} */
  541.     @Override
  542.     public Binary64 linearCombination(final Binary64[] a, final Binary64[] b)
  543.         throws MathIllegalArgumentException {
  544.         MathUtils.checkDimension(a.length, b.length);
  545.         final double[] aDouble = new double[a.length];
  546.         final double[] bDouble = new double[b.length];
  547.         for (int i = 0; i < a.length; ++i) {
  548.             aDouble[i] = a[i].value;
  549.             bDouble[i] = b[i].value;
  550.         }
  551.         return new Binary64(MathArrays.linearCombination(aDouble, bDouble));
  552.     }

  553.     /** {@inheritDoc} */
  554.     @Override
  555.     public Binary64 linearCombination(final double[] a, final Binary64[] b)
  556.         throws MathIllegalArgumentException {
  557.         MathUtils.checkDimension(a.length, b.length);
  558.         final double[] bDouble = new double[b.length];
  559.         for (int i = 0; i < a.length; ++i) {
  560.             bDouble[i] = b[i].value;
  561.         }
  562.         return new Binary64(MathArrays.linearCombination(a, bDouble));
  563.     }

  564.     /** {@inheritDoc} */
  565.     @Override
  566.     public Binary64 linearCombination(final Binary64 a1, final Binary64 b1,
  567.                                        final Binary64 a2, final Binary64 b2) {
  568.         return new Binary64(MathArrays.linearCombination(a1.value, b1.value,
  569.                                                           a2.value, b2.value));
  570.     }

  571.     /** {@inheritDoc} */
  572.     @Override
  573.     public Binary64 linearCombination(final double a1, final Binary64 b1,
  574.                                        final double a2, final Binary64 b2) {
  575.         return new Binary64(MathArrays.linearCombination(a1, b1.value,
  576.                                                           a2, b2.value));
  577.     }

  578.     /** {@inheritDoc} */
  579.     @Override
  580.     public Binary64 linearCombination(final Binary64 a1, final Binary64 b1,
  581.                                        final Binary64 a2, final Binary64 b2,
  582.                                        final Binary64 a3, final Binary64 b3) {
  583.         return new Binary64(MathArrays.linearCombination(a1.value, b1.value,
  584.                                                           a2.value, b2.value,
  585.                                                           a3.value, b3.value));
  586.     }

  587.     /** {@inheritDoc} */
  588.     @Override
  589.     public Binary64 linearCombination(final double a1, final Binary64 b1,
  590.                                        final double a2, final Binary64 b2,
  591.                                        final double a3, final Binary64 b3) {
  592.         return new Binary64(MathArrays.linearCombination(a1, b1.value,
  593.                                                           a2, b2.value,
  594.                                                           a3, b3.value));
  595.     }

  596.     /** {@inheritDoc} */
  597.     @Override
  598.     public Binary64 linearCombination(final Binary64 a1, final Binary64 b1,
  599.                                        final Binary64 a2, final Binary64 b2,
  600.                                        final Binary64 a3, final Binary64 b3,
  601.                                        final Binary64 a4, final Binary64 b4) {
  602.         return new Binary64(MathArrays.linearCombination(a1.value, b1.value,
  603.                                                           a2.value, b2.value,
  604.                                                           a3.value, b3.value,
  605.                                                           a4.value, b4.value));
  606.     }

  607.     /** {@inheritDoc} */
  608.     @Override
  609.     public Binary64 linearCombination(final double a1, final Binary64 b1,
  610.                                        final double a2, final Binary64 b2,
  611.                                        final double a3, final Binary64 b3,
  612.                                        final double a4, final Binary64 b4) {
  613.         return new Binary64(MathArrays.linearCombination(a1, b1.value,
  614.                                                           a2, b2.value,
  615.                                                           a3, b3.value,
  616.                                                           a4, b4.value));
  617.     }

  618.     /** {@inheritDoc} */
  619.     @Override
  620.     public Binary64 getPi() {
  621.         return PI;
  622.     }

  623. }