extern "C" Box* floatModInt(BoxedFloat* lhs, BoxedInt *rhs) { assert(lhs->cls == float_cls); assert(rhs->cls == int_cls); return boxFloat(mod_float_float(lhs->d, rhs->n)); }
extern "C" Box* floatDivFloat(BoxedFloat* lhs, BoxedFloat* rhs) { assert(lhs->cls == float_cls); assert(rhs->cls == float_cls); raiseDivZeroExcIfZero(rhs->d); return boxFloat(lhs->d / rhs->d); }
extern "C" Box* floatRDivInt(BoxedFloat* lhs, BoxedInt *rhs) { assert(lhs->cls == float_cls); assert(rhs->cls == int_cls); raiseDivZeroExcIfZero(lhs->d); return boxFloat(rhs->n / lhs->d); }
void setupFloat() { float_cls->giveAttr("__name__", boxStrConstant("float")); _addFunc("__add__", BOXED_FLOAT, (void*)floatAddFloat, (void*)floatAddInt, (void*)floatAdd); float_cls->giveAttr("__radd__", float_cls->getattr("__add__")); _addFunc("__div__", BOXED_FLOAT, (void*)floatDivFloat, (void*)floatDivInt, (void*)floatDiv); _addFunc("__rdiv__", BOXED_FLOAT, (void*)floatRDivFloat, (void*)floatRDivInt, (void*)floatRDiv); float_cls->giveAttr("__floordiv__", new BoxedFunction(boxRTFunction((void*)floatFloorDiv, UNKNOWN, 2))); _addFunc("__truediv__", BOXED_FLOAT, (void*)floatDivFloat, (void*)floatDivInt, (void*)floatTruediv); _addFunc("__eq__", BOXED_BOOL, (void*)floatEqFloat, (void*)floatEqInt, (void*)floatEq); _addFunc("__ge__", BOXED_BOOL, (void*)floatGeFloat, (void*)floatGeInt, (void*)floatGe); _addFunc("__gt__", BOXED_BOOL, (void*)floatGtFloat, (void*)floatGtInt, (void*)floatGt); _addFunc("__le__", BOXED_BOOL, (void*)floatLeFloat, (void*)floatLeInt, (void*)floatLe); _addFunc("__lt__", BOXED_BOOL, (void*)floatLtFloat, (void*)floatLtInt, (void*)floatLt); _addFunc("__ne__", BOXED_BOOL, (void*)floatNeFloat, (void*)floatNeInt, (void*)floatNe); _addFunc("__mod__", BOXED_FLOAT, (void*)floatModFloat, (void*)floatModInt, (void*)floatMod); _addFunc("__rmod__", BOXED_FLOAT, (void*)floatRModFloat, (void*)floatRModInt, (void*)floatRMod); _addFunc("__mul__", BOXED_FLOAT, (void*)floatMulFloat, (void*)floatMulInt, (void*)floatMul); float_cls->giveAttr("__rmul__", float_cls->getattr("__mul__")); _addFunc("__pow__", BOXED_FLOAT, (void*)floatPowFloat, (void*)floatPowInt, (void*)floatPow); _addFunc("__sub__", BOXED_FLOAT, (void*)floatSubFloat, (void*)floatSubInt, (void*)floatSub); _addFunc("__rsub__", BOXED_FLOAT, (void*)floatRSubFloat, (void*)floatRSubInt, (void*)floatRSub); float_cls->giveAttr( "__new__", new BoxedFunction(boxRTFunction((void*)floatNew, UNKNOWN, 2, 1, false, false), { boxFloat(0.0) })); float_cls->giveAttr("__neg__", new BoxedFunction(boxRTFunction((void*)floatNeg, BOXED_FLOAT, 1))); CLFunction* nonzero = boxRTFunction((void*)floatNonzeroUnboxed, BOOL, 1); addRTFunction(nonzero, (void*)floatNonzero, UNKNOWN); float_cls->giveAttr("__nonzero__", new BoxedFunction(nonzero)); // float_cls->giveAttr("__nonzero__", new BoxedFunction(boxRTFunction((void*)floatNonzero, NULL, 1))); float_cls->giveAttr("__str__", new BoxedFunction(boxRTFunction((void*)floatStr, STR, 1))); float_cls->giveAttr("__repr__", new BoxedFunction(boxRTFunction((void*)floatRepr, STR, 1))); float_cls->freeze(); }
extern "C" Box* floatAddInt(BoxedFloat* lhs, BoxedInt* rhs) { assert(lhs->cls == float_cls); assert(rhs->cls == int_cls); return boxFloat(lhs->d + rhs->n); }
Box* floatNeg(BoxedFloat* self) { assert(self->cls == float_cls); return boxFloat(-self->d); }
extern "C" Box* floatRSubFloat(BoxedFloat* lhs, BoxedFloat* rhs) { assert(lhs->cls == float_cls); assert(rhs->cls == float_cls); return boxFloat(rhs->d - lhs->d); }
extern "C" Box* floatPowFloat(BoxedFloat* lhs, BoxedFloat* rhs) { assert(lhs->cls == float_cls); assert(rhs->cls == float_cls); return boxFloat(pow(lhs->d, rhs->d)); }
extern "C" Box* floatRModFloat(BoxedFloat* lhs, BoxedFloat* rhs) { assert(lhs->cls == float_cls); assert(rhs->cls == float_cls); return boxFloat(mod_float_float(rhs->d, lhs->d)); }
extern "C" PyObject* PyFloat_FromDouble(double d) { return boxFloat(d); }