
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Random;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import java.nio.DoubleBuffer;
import java.lang.Float;

/**
 *
 * @author fthurber
 */

public class FourFloat {

    static byte[] gernateRandomBytes(int size)
    {
        byte bytes_array[] = new byte[size];
        Random generator = new Random();
        generator.nextBytes(bytes_array);
        return bytes_array;
    }

  /**
    * Convert four bytes into a float value.
    *
    * @return float value
    */
   public static float float4(int a, int b, int c, int d)
   {
      int sgn, mant, exp;

      mant = b << 16 | c << 8 | d;
      if (mant == 0) return 0.0f;

      sgn = -(((a & 128) >> 6) - 1);
      exp = (a & 127) - 64;

      return (float) (sgn * Math.pow(16.0, exp - 6) * mant);
   }

    static ByteBuffer bb = ByteBuffer.allocate(4);
    private static final float float4NIO(final byte a, final byte b, 
                final byte c, final byte d)
    {
        bb.clear();
        bb.put(a).put(b).put(c).put(d);
        return bb.getFloat(0);
    }    
    

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
            
        final int size = 10000000;
        byte[] randBytes = gernateRandomBytes(size);
        float result = Float.NaN;
        
        long startTime = System.currentTimeMillis();
        for (int i=0; i<size-4; i++) {
            result = float4(randBytes[i], randBytes[i+1], 
                    randBytes[i+2], randBytes[i+3]);
        }
        long endTime = System.currentTimeMillis();
        System.err.println("Elapsed time float4:\t" + (endTime - startTime));
 
        startTime = System.currentTimeMillis();
        for (int i=0; i<size-4; i++) {
            result = float4NIO(randBytes[i], randBytes[i+1], 
                    randBytes[i+2], randBytes[i+3]);
        }
        endTime = System.currentTimeMillis();
        System.err.println("Elapsed time float4NIO:\t" + (endTime - startTime));
  
      
    }
    
}

