forked from xuos/xiuos
				
			
		
			
				
	
	
		
			136 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /* Copyright JS Foundation and other contributors, http://js.foundation
 | |
|  *
 | |
|  * Licensed 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.
 | |
|  *
 | |
|  * This file is based on work under the following copyright and permission
 | |
|  * notice:
 | |
|  *
 | |
|  *     Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 | |
|  *
 | |
|  *     Developed at SunSoft, a Sun Microsystems, Inc. business.
 | |
|  *     Permission to use, copy, modify, and distribute this
 | |
|  *     software is freely granted, provided that this notice
 | |
|  *     is preserved.
 | |
|  *
 | |
|  *     @(#)s_nextafter.c 1.3 95/01/18
 | |
|  */
 | |
| 
 | |
| #include "jerry-math-internal.h"
 | |
| 
 | |
| double
 | |
| nextafter (double x,
 | |
|            double y)
 | |
| {
 | |
|   int hx, hy, ix, iy;
 | |
|   unsigned lx, ly;
 | |
|   double_accessor ret;
 | |
| 
 | |
|   hx = __HI (x); /* high word of x */
 | |
|   lx = __LO (x); /* low  word of x */
 | |
|   hy = __HI (y); /* high word of y */
 | |
|   ly = __LO (y); /* low  word of y */
 | |
|   ix = hx & 0x7fffffff; /* |x| */
 | |
|   iy = hy & 0x7fffffff; /* |y| */
 | |
| 
 | |
|   if (((ix >= 0x7ff00000) && ((ix - 0x7ff00000) | lx) != 0)     /* x is nan */
 | |
|       || ((iy >= 0x7ff00000) && ((iy - 0x7ff00000) | ly) != 0)) /* y is nan */
 | |
|   {
 | |
|     return x + y;
 | |
|   }
 | |
| 
 | |
|   if (x == y)
 | |
|   {
 | |
|     return x; /* x=y, return x */
 | |
|   }
 | |
| 
 | |
|   if ((ix | lx) == 0)
 | |
|   { /* x == 0 */
 | |
|     ret.as_int.hi = hy & 0x80000000; /* return +-minsubnormal */
 | |
|     ret.as_int.lo = 1;
 | |
|     y = ret.dbl * ret.dbl;
 | |
|     if (y == ret.dbl)
 | |
|     {
 | |
|       return y;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       return ret.dbl; /* raise underflow flag */
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (hx >= 0)
 | |
|   { /* x > 0 */
 | |
|     if (hx > hy || ((hx == hy) && (lx > ly)))
 | |
|     { /* x > y, x -= ulp */
 | |
|       if (lx == 0)
 | |
|       {
 | |
|         hx -= 1;
 | |
|       }
 | |
| 
 | |
|       lx -= 1;
 | |
|     }
 | |
|     else
 | |
|     { /* x < y, x += ulp */
 | |
|       lx += 1;
 | |
| 
 | |
|       if (lx == 0)
 | |
|       {
 | |
|         hx += 1;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   else
 | |
|   { /* x < 0 */
 | |
|     if (hy >= 0 || hx > hy || ((hx == hy) && (lx > ly)))
 | |
|     { /* x < y, x -= ulp */
 | |
|       if (lx == 0)
 | |
|       {
 | |
|         hx -= 1;
 | |
|       }
 | |
| 
 | |
|       lx -= 1;
 | |
|     }
 | |
|     else
 | |
|     { /* x > y, x += ulp */
 | |
|       lx += 1;
 | |
| 
 | |
|       if (lx == 0)
 | |
|       {
 | |
|         hx += 1;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   hy = hx & 0x7ff00000;
 | |
| 
 | |
|   if (hy >= 0x7ff00000)
 | |
|   {
 | |
|     return x + x; /* overflow */
 | |
|   }
 | |
| 
 | |
|   if (hy < 0x00100000)
 | |
|   { /* underflow */
 | |
|     y = x * x;
 | |
|     if (y != x)
 | |
|     { /* raise underflow flag */
 | |
|       ret.as_int.hi = hx;
 | |
|       ret.as_int.lo = lx;
 | |
|       return ret.dbl;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   ret.as_int.hi = hx;
 | |
|   ret.as_int.lo = lx;
 | |
|   return ret.dbl;
 | |
| } /* nextafter */
 |