1 /* 2 * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 27 #include "mlib_image.h" 28 29 /***************************************************************/ 30 typedef union { 31 mlib_d64 db; 32 struct { 33 #ifdef _LITTLE_ENDIAN 34 mlib_s32 int1, int0; 35 #else 36 mlib_s32 int0, int1; 37 #endif 38 } two_int; 39 } type_union_mlib_d64; 40 41 #define DVAIN52 4.503599627370496e15 42 43 /***************************************************************/ 44 mlib_s32 mlib_ilogb(mlib_d64 X) 45 { 46 type_union_mlib_d64 arg; 47 mlib_s32 n; 48 49 if (X == 0.0) 50 return -MLIB_S32_MAX; 51 arg.db = X; 52 n = arg.two_int.int0 & 0x7ff00000; 53 if (n) 54 n = (n < 0x7ff00000) ? (n >> 20) - 1023 : MLIB_S32_MAX; 55 else { 56 arg.db = X * DVAIN52; 57 n = ((arg.two_int.int0 & 0x7ff00000) >> 20) - 1075; 58 } 59 return n; 60 } 61 62 /***************************************************************/