#include "ikarus.h" #include #include #include #include #if 0 ikp ikrt_is_flonum(ikp x){ if(tagof(x) == vector_tag){ if (ref(x, -vector_tag) == flonum_tag){ return true_object; } } return false_object; } #endif ikp ikrt_string_to_flonum(ikp x, ikpcb* pcb){ double v = strtod(string_data(x), NULL); ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = v; return r; } ikp ikrt_fl_plus(ikp x, ikp y,ikpcb* pcb){ ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = flonum_data(x) + flonum_data(y); return r; } ikp ikrt_fl_minus(ikp x, ikp y,ikpcb* pcb){ ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = flonum_data(x) - flonum_data(y); return r; } ikp ikrt_fl_times(ikp x, ikp y,ikpcb* pcb){ ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = flonum_data(x) * flonum_data(y); return r; } ikp ikrt_fl_div(ikp x, ikp y,ikpcb* pcb){ ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = flonum_data(x) / flonum_data(y); return r; } ikp ikrt_fl_invert(ikp x, ikpcb* pcb){ ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = 1.0 / flonum_data(x); return r; } ikp ikrt_fl_sin(ikp x, ikpcb* pcb){ ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = sin(flonum_data(x)); return r; } ikp ikrt_fx_sin(ikp x, ikpcb* pcb){ ikp r = ik_alloc(pcb, flonum_size) + vector_tag; ref(r, -vector_tag) = (ikp)flonum_tag; flonum_data(r) = sin(unfix(x)); return r; } ikp ikrt_flonum_to_string(ikp x, ikpcb* pcb){ if(tagof(x) == vector_tag){ if(ref(x,-vector_tag) == flonum_tag){ char buff[80]; int n = snprintf(buff, sizeof(buff)-2, "%.12G", flonum_data(x)); if(n >= 0){ int i=0; while ((i