[Camllist] how to split up a Caml float into its component bytes
[
Home
]
[ Index:
by date

by threads
]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
[ Message by date: previous  next ] [ Message in thread: previous  next ] [ Thread: previous  next ]
Date:   (:) 
From:  Ken Rose <kenarose@e...> 
Subject:  Re: [Camllist] how to split up a Caml float into its component bytes 
Rafael 'Dido' Sevilla wrote: > > I've been writing a byte compiler for a small language using Objective > Caml, and now am thinking about incorporating floating point support > into the language. I'm wondering how I would convert a floating point > number in OCaml (which I hope I am safe in assuming is IEEE754) into > its equivalent bytes. I need it to be able to output bytecode > instructions that will load floating point constants into the virtual > machine. In C this is fairly trivial to do; not sure how to do it in > OCaml. I was having a similar problem and came up with these two functions, intended for a C compiler. They produce strings encoding 32 bits at a time, to write into assembly output. I'm not sure it handles gradual underflow correctly, but since my target hardware doesn't, it didn't matter to me.  ken and cook_float f = let mant, exp = frexp f in let sign = if mant < 0.0 then Int32.min_int else Int32.zero in let exponent = Int32.shift_left (Int32.of_int(exp + 126)) 23 in let mantissa = Int32.of_float((mant . 0.5) *. 16777216.0) in Int32.format "0x%x" (Int32.logor sign (Int32.logor exponent mantissa)) and cook_double d = if d = 0.0 then ("0","0") else let mant, exp = frexp d in let sign = if mant < 0.0 then Int32.min_int else Int32.zero in let exponent = Int32.shift_left (Int32.of_int(exp + 1022)) 20 in let f,t = modf (((abs_float mant) . 0.5) *. 2097152.0) in let highmantissa = Int32.of_float(t) in let highword = Int32.logor sign (Int32.logor exponent highmantissa) in let l, h = modf (f *. 65536.0) in let low1 = Int32.shift_left (Int32.of_float h) 16 in let low2 = Int32.of_float (l *. 65536.0) in let lowmantissa = Int32.of_float(f *. (ldexp 1.0 32)) in let lowword = Int32.logor low1 low2 in Int32.format "0x%x" highword, Int32.format "0x%x" lowword  Bug reports: http://caml.inria.fr/bin/camlbugs FAQ: http://caml.inria.fr/FAQ/ To unsubscribe, mail camllistrequest@inria.fr Archives: http://caml.inria.fr