newtRef NcMultiply(newtRefArg r1, newtRefArg r2) { bool real; if (! NewtArgsIsNumber(r1, r2, &real)) return NewtThrow0(kNErrNotANumber); if (real) { double real1; double real2; real1 = NewtRefToReal(r1); real2 = NewtRefToReal(r2); return NewtMakeReal(real1 * real2); } else { int32_t int1; int32_t int2; int1 = NewtRefToInteger(r1); int2 = NewtRefToInteger(r2); return NewtMakeInteger(int1 * int2); } }
newtRef NcDivide(newtRefArg r1, newtRefArg r2) { bool real; if (! NewtArgsIsNumber(r1, r2, &real)) return NewtThrow0(kNErrNotANumber); if (real) { double real1; double real2; real1 = NewtRefToReal(r1); real2 = NewtRefToReal(r2); if (real2 == 0.0) return NewtThrow(kNErrDiv0, r2); return NewtMakeReal(real1 / real2); } else { int32_t int1; int32_t int2; int1 = NewtRefToInteger(r1); int2 = NewtRefToInteger(r2); if (int2 == 0) return NewtThrow(kNErrDiv0, r2); return NewtMakeInteger(int1 / int2); } }