double unsigned_to_double1 (u) unsigned u; { double d; d = (int) u; /* convert as from a *signed* integer */ return ((int) u < 0) ? d + 4294967296.0 : d; } /* Alternatively */ double unsigned_to_double2 (u) unsigned u; { double d; u -= 2147483648; /* complement sign bit */ d = (int) u; /* convert as from a *signed* integer */ return d + 2147483648.0; } unsigned double_to_unsigned (d) double d; { d += 2147483648.0; return ((int) d) - 2147483648; }