pike.git/
src/
encode.c
Branch:
Tag:
Non-build tags
All tags
No tags
1997-04-07
1997-04-07 03:31:45 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
892e7fe49c1a2a40d1cce4385676450253789d43 (
47
lines) (+
43
/-
4
)
[
Show
|
Annotate
]
Branch:
7.9
now uses frexp/ldexp to encode/decode floats
Rev: src/configure.in:1.67
Rev: src/encode.c:1.6
28:
#include <math.h>
+
#ifdef HAVE_FREXP
+
#define FREXP frexp
+
#else
+
double frexp(double x, int *exp)
+
{
+
double ret;
+
*exp=(int)ceil(log(x)/log(2.0));
+
ret=(x*pow(2.0,(float)-*exp));
+
return tmp;
+
}
+
#endif
+
+
#ifdef HAVE_FREXP
+
#define FREXP frexp
+
#else
+
double FREXP(double x, int *exp)
+
{
+
double ret;
+
*exp=(int)ceil(log(x)/log(2.0));
+
ret=(x*pow(2.0,(float)-*exp));
+
return tmp;
+
}
+
#endif
+
+
#if HAVE_LDEXP
+
#define LDEXP ldexp
+
#else
+
double LDEXP(double x, int exp)
+
{
+
return x * pow(2.0,(double)exp);
+
}
+
#endif
+
+
struct encode_data { struct svalue counter;
117:
code_entry(T_FLOAT,0,data); code_entry(T_FLOAT,0,data); }else{
-
INT32 x
,y
;
-
y=(
int)ceil
(
log(
val->u.float_number)
/log(2.0))-30
;
-
x=(
int
)((
val->u.float_number
)*
pow(2.0,(float
)
-
y
))
;
+
INT32 x
;
+
int
y;
+
double tmp;
+
+
tmp
=
FREXP
(
(double
)val->u.float_number
, &y
);
+
x=(
INT32
)((
1<<30
)*
tmp
)
;
+
y
-
=30
;
while(x && y && !(x&1)) { x>>=1;
280:
data->counter.u.integer++; DECODE();
-
push_float(
num2 * pow
(
2.0,
(double) num));
+
push_float(
LDEXP
((double)
num2,
num));
break; }