Mega Code Archive

 
Categories / Java / Data Type
 

Get the next machine representable number after a number, moving in the direction of another number

import java.io.File; /*   * 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.  *  *  */ public class Main {   /**    * Get the next machine representable number after a number, moving    * in the direction of another number.    * <p>    * If <code>direction</code> is greater than or equal to<code>d</code>,    * the smallest machine representable number strictly greater than    * <code>d</code> is returned; otherwise the largest representable number    * strictly less than <code>d</code> is returned.</p>    * <p>    * If <code>d</code> is NaN or Infinite, it is returned unchanged.</p>    *     * @param d base number    * @param direction (the only important thing is whether    * direction is greater or smaller than d)    * @return the next machine representable number in the specified direction    * @since 1.2    */   public static double nextAfter(double d, double direction) {       // handling of some important special cases       if (Double.isNaN(d) || Double.isInfinite(d)) {               return d;       } else if (d == 0) {               return (direction < 0) ? -Double.MIN_VALUE : Double.MIN_VALUE;       }       // special cases MAX_VALUE to infinity and  MIN_VALUE to 0       // are handled just as normal numbers       // split the double in raw components       long bits     = Double.doubleToLongBits(d);       long sign     = bits & 0x8000000000000000L;       long exponent = bits & 0x7ff0000000000000L;       long mantissa = bits & 0x000fffffffffffffL;       if (d * (direction - d) >= 0) {               // we should increase the mantissa               if (mantissa == 0x000fffffffffffffL) {                       return Double.longBitsToDouble(sign |                                       (exponent + 0x0010000000000000L));               } else {                       return Double.longBitsToDouble(sign |                                       exponent | (mantissa + 1));               }       } else {               // we should decrease the mantissa               if (mantissa == 0L) {                       return Double.longBitsToDouble(sign |                                       (exponent - 0x0010000000000000L) |                                       0x000fffffffffffffL);               } else {                       return Double.longBitsToDouble(sign |                                       exponent | (mantissa - 1));               }       }   } }