Acme-ExtUtils-XSOne-Test-Calculator

 view release on metacpan or  search on metacpan

Calculator.xs  view on Meta::CPAN

        return 0.0;
    }
    *error = 0;
    return log(a);
}

static double sci_safe_sqrt(double a, int *error) {
    if (a < 0.0) {
        *error = 1;
        return 0.0;
    }
    *error = 0;
    return sqrt(a);
}

static double sci_ipow(double base, int exp) {
    /* Integer power - faster than pow() for integer exponents */
    if (exp == 0) return 1.0;
    int neg = 0;
    if (exp < 0) {
        neg = 1;
        exp = -exp;
    }
    double result = 1.0;
    while (exp > 0) {
        if (exp & 1) result *= base;
        base *= base;
        exp >>= 1;
    }
    return neg ? 1.0 / result : result;
}

static double sci_combination(int n, int r) {
    if (r > n || r < 0) return 0.0;
    if (r == 0 || r == n) return 1.0;
    double result = 1.0;
    for (int i = 0; i < r; i++) {
        result = result * (n - i) / (i + 1);
    }
    return result;
}
/* C code from: Calculator/Trig.xs */
#line 1 "lib/Acme/ExtUtils/XSOne/Test/Calculator/Trig.xs"
/*
 * Acme::ExtUtils::XSOne::Test::Calculator::Trig - Trigonometric functions
 */


/* C helper functions for Trig package */
static double trig_normalize_angle(double radians) {
    /* Normalize angle to [-PI, PI] */
    while (radians > M_PI) radians -= 2.0 * M_PI;
    while (radians < -M_PI) radians += 2.0 * M_PI;
    return radians;
}

static int trig_is_valid_asin_arg(double x) {
    return (x >= -1.0 && x <= 1.0);
}

static double trig_sec(double x) {
    return 1.0 / cos(x);
}

static double trig_csc(double x) {
    return 1.0 / sin(x);
}

static double trig_cot(double x) {
    return cos(x) / sin(x);
}
/* C code from: _footer.xs */
#line 1 "lib/Acme/ExtUtils/XSOne/Test/_footer.xs"
/*
 * Acme::ExtUtils::XSOne::Test::Calculator - Main module and BOOT section
 */
/* ========== END COMBINED C PREAMBLE ========== */

MODULE = Acme::ExtUtils::XSOne::Test::Calculator    PACKAGE = Acme::ExtUtils::XSOne::Test::Calculator::Basic

PROTOTYPES: DISABLE

double
add(a, b)
    double a
    double b
CODE:
    RETVAL = a + b;
    add_to_history('+', a, b, RETVAL);
OUTPUT:
    RETVAL

double
subtract(a, b)
    double a
    double b
CODE:
    RETVAL = a - b;
    add_to_history('-', a, b, RETVAL);
OUTPUT:
    RETVAL

double
multiply(a, b)
    double a
    double b
CODE:
    RETVAL = a * b;
    add_to_history('*', a, b, RETVAL);
OUTPUT:
    RETVAL

double
divide(a, b)
    double a
    double b
CODE:
    if (b == 0.0) {
        croak("Division by zero");
    }
    RETVAL = a / b;
    add_to_history('/', a, b, RETVAL);
OUTPUT:
    RETVAL

double
modulo(a, b)
    double a
    double b
CODE:
    if (b == 0.0) {
        croak("Modulo by zero");
    }
    RETVAL = fmod(a, b);
    add_to_history('%', a, b, RETVAL);

Calculator.xs  view on Meta::CPAN

    }
    RETVAL = acos(a);
    add_to_history('C', a, 0, RETVAL);
OUTPUT:
    RETVAL

double
atan_val(a)
    double a
CODE:
    RETVAL = atan(a);
    add_to_history('T', a, 0, RETVAL);
OUTPUT:
    RETVAL

double
atan2_val(y, x)
    double y
    double x
CODE:
    RETVAL = atan2(y, x);
    add_to_history('A', y, x, RETVAL);
OUTPUT:
    RETVAL

double
deg_to_rad(degrees)
    double degrees
CODE:
    RETVAL = degrees * M_PI / 180.0;
OUTPUT:
    RETVAL

double
rad_to_deg(radians)
    double radians
CODE:
    RETVAL = radians * 180.0 / M_PI;
OUTPUT:
    RETVAL

double
hypot_val(a, b)
    double a
    double b
CODE:
    RETVAL = hypot(a, b);
    add_to_history('h', a, b, RETVAL);
OUTPUT:
    RETVAL

double
normalize_angle(radians)
    double radians
CODE:
    RETVAL = trig_normalize_angle(radians);
OUTPUT:
    RETVAL

double
sec_val(a)
    double a
CODE:
    RETVAL = trig_sec(a);
    add_to_history('E', a, 0, RETVAL);
OUTPUT:
    RETVAL

double
csc_val(a)
    double a
CODE:
    RETVAL = trig_csc(a);
    add_to_history('O', a, 0, RETVAL);
OUTPUT:
    RETVAL

double
cot_val(a)
    double a
CODE:
    RETVAL = trig_cot(a);
    add_to_history('G', a, 0, RETVAL);
OUTPUT:
    RETVAL

int
is_valid_asin_arg(x)
    double x
CODE:
    RETVAL = trig_is_valid_asin_arg(x);
OUTPUT:
    RETVAL

void
import(...)
CODE:
{
    static const char *trig_exports[] = {
        "sin_val", "cos_val", "tan_val",
        "asin_val", "acos_val", "atan_val", "atan2_val",
        "deg_to_rad", "rad_to_deg", "hypot_val",
        "normalize_angle", "sec_val", "csc_val", "cot_val",
        "is_valid_asin_arg"
    };
    do_import(aTHX_ "Acme::ExtUtils::XSOne::Test::Calculator::Trig",
              trig_exports, 15, items, ax);
}


MODULE = Acme::ExtUtils::XSOne::Test::Calculator    PACKAGE = Acme::ExtUtils::XSOne::Test::Calculator

PROTOTYPES: DISABLE

double
pi()
CODE:
    RETVAL = M_PI;
OUTPUT:
    RETVAL

double
e()
CODE:
    RETVAL = M_E;
OUTPUT:
    RETVAL

const char *
version()
CODE:
    RETVAL = "0.01";
OUTPUT:
    RETVAL

BOOT:
    /* Initialize memory on module load */
    init_memory();



( run in 0.544 second using v1.01-cache-2.11-cpan-39bf76dae61 )