3 void primitive_floatp(void)
5 check_non_empty(env.dt);
6 env.dt = tag_boolean(typep(FLOAT_TYPE,env.dt));
9 FLOAT* to_float(CELL tagged)
11 switch(type_of(tagged))
14 return fixnum_to_float(tagged);
16 return bignum_to_float(tagged);
18 return ratio_to_float(tagged);
20 return (FLOAT*)UNTAG(tagged);
22 type_error(FLOAT_TYPE,tagged);
23 return NULL; /* can't happen */
27 void primitive_to_float(void)
29 env.dt = tag_object(to_float(env.dt));
32 void primitive_str_to_float(void)
34 char* c_str = to_c_string(untag_string(env.dt));
35 env.dt = tag_object(make_float(atof(c_str)));
38 void primitive_float_to_str(void)
41 snprintf(&tmp,32,"%.16g",untag_float(env.dt)->n);
43 env.dt = tag_object(from_c_string(tmp));
46 void primitive_float_to_bits(void)
51 CELL number_eq_float(CELL x, CELL y)
53 return tag_boolean(((FLOAT*)UNTAG(x))->n
54 == ((FLOAT*)UNTAG(y))->n);
57 CELL add_float(CELL x, CELL y)
59 return tag_object(make_float(((FLOAT*)UNTAG(x))->n
60 + ((FLOAT*)UNTAG(y))->n));
63 CELL subtract_float(CELL x, CELL y)
65 return tag_object(make_float(((FLOAT*)UNTAG(x))->n
66 - ((FLOAT*)UNTAG(y))->n));
69 CELL multiply_float(CELL x, CELL y)
71 return tag_object(make_float(((FLOAT*)UNTAG(x))->n
72 * ((FLOAT*)UNTAG(y))->n));
75 CELL divide_float(CELL x, CELL y)
77 return tag_object(make_float(((FLOAT*)UNTAG(x))->n
78 / ((FLOAT*)UNTAG(y))->n));
81 CELL divfloat_float(CELL x, CELL y)
83 return tag_object(make_float(((FLOAT*)UNTAG(x))->n
84 / ((FLOAT*)UNTAG(y))->n));
87 CELL less_float(CELL x, CELL y)
89 return tag_boolean(((FLOAT*)UNTAG(x))->n
90 < ((FLOAT*)UNTAG(y))->n);
93 CELL lesseq_float(CELL x, CELL y)
95 return tag_boolean(((FLOAT*)UNTAG(x))->n
96 <= ((FLOAT*)UNTAG(y))->n);
99 CELL greater_float(CELL x, CELL y)
101 return tag_boolean(((FLOAT*)UNTAG(x))->n
102 > ((FLOAT*)UNTAG(y))->n);
105 CELL greatereq_float(CELL x, CELL y)
107 return tag_boolean(((FLOAT*)UNTAG(x))->n
108 >= ((FLOAT*)UNTAG(y))->n);