/* * Copyright 2010 Google Inc. * * 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. */ package com.google.gwt.corp.compatibility; import com.google.gwt.typedarrays.client.Float32ArrayNative; import com.google.gwt.typedarrays.client.Int32ArrayNative; import com.google.gwt.typedarrays.client.Int8ArrayNative; import com.google.gwt.typedarrays.shared.Float32Array; import com.google.gwt.typedarrays.shared.Int32Array; import com.google.gwt.typedarrays.shared.Int8Array; public class Numbers { static final double LN2 = Math.log(2); public static final int floatToIntBits (float f) { wfa.set(0, f); return wia.get(0); // if (Float.isNaN(f)) { // return 0x7f800001; // } // int signBit; // if (f == 0) { // return (1/f == Float.NEGATIVE_INFINITY) ? 0x80000000 : 0; // } else if (f < 0) { // f = -f; // signBit = 0x80000000; // } else { // signBit = 0; // } // if (f == Float.POSITIVE_INFINITY) { // return signBit | 0x7f800000; // } // // int exponent = (int) (Math.log(f) / LN2); // if (exponent < -126) { // exponent = -126; // } // int significand = (int) (0.5 + f * Math.exp(-(exponent - 23) * LN2)); // // // Handle exponent rounding issues & denorm // if ((significand & 0x01000000) != 0) { // significand >>= 1; // exponent++; // } else if ((significand & 0x00800000) == 0) { // if (exponent == -126) { // return signBit | significand; // } else { // significand <<= 1; // exponent--; // } // } // // return signBit | ((exponent + 127) << 23) | (significand & 0x007fffff); } static Int8Array wba = Int8ArrayNative.create(4); static Int32Array wia = Int32ArrayNative.create(wba.buffer(), 0, 1); static Float32Array wfa = Float32ArrayNative.create(wba.buffer(), 0, 1); public static final float intBitsToFloat (int i) { // wba.set(0, (byte) (i >> 24)); // wba.set(1, (byte) (i >> 16)); // wba.set(2, (byte) (i >> 8)); // wba.set(3, (byte) (i)); wia.set(0, i); return wfa.get(0); // // // int exponent = (i >>> 23) & 255; // int significand = i & 0x007fffff; // float result; // if (exponent == 0) { // result = (float) (Math.exp((-126 - 23) * LN2) * significand); // } else if (exponent == 255) { // result = significand == 0 ? Float.POSITIVE_INFINITY : Float.NaN; // } else { // result = (float) (Math.exp((exponent - 127 - 23) * LN2) * (0x00800000 | significand)); // } // // return (i & 0x80000000) == 0 ? result : -result; } public static final long doubleToLongBits (Double d) { throw new RuntimeException("NYI"); } public static final double longBitsToDouble (long l) { throw new RuntimeException("NYI"); } public static long doubleToRawLongBits (double value) { throw new RuntimeException("NYI: Numbers.doubleToRawLongBits"); } }