Index: ossp-pkg/xds/float2xds-float.c RCS File: /v/ossp/cvs/ossp-pkg/xds/Attic/float2xds-float.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/xds/Attic/float2xds-float.c,v' | diff -u /dev/null - -L'ossp-pkg/xds/float2xds-float.c' 2>/dev/null --- ossp-pkg/xds/float2xds-float.c +++ - 2024-05-15 15:38:01.085905890 +0200 @@ -0,0 +1,71 @@ +#include "xds_p.h" + +int float2xds_float(xds_float_t* new_num, float num) + { + const static unsigned int base = 2; + size_t i; + float tmp; + + /* Handle zero as a special case. */ + + if (num == 0.0) + { + new_num->sign = 0; + new_num->fraction = 0; + new_num->exponent = -127; + return 0; + } + + /* Determine the sign of the number. */ + + if (num < 0) + { + new_num->sign = 1; + num = 0 - num; + } + else + new_num->sign = 0; + + /* Canonify the number before we convert it. */ + + new_num->exponent = 0; + while (num < 1) + { + num *= base; + --new_num->exponent; + } + + /* Find the exponent. */ + + for (i = 0, tmp = 1; i <= 128; ++i, tmp *= base) + { + if (tmp*base > num) + break; + } + if (i <= 128) + { + num = num / tmp - 1; + new_num->exponent += i; + } + else + return 1; + + /* Calculate the fraction part. */ + + for (new_num->fraction = 0, i = 0; i < 23; ++i) + { + new_num->fraction *= base; + if (num >= 1.0 / base) + { + new_num->fraction |= 1; + num = num * base - 1; + } + else + { + new_num->fraction |= 0; + num *= base; + } + } + + return 0; + }