Acme-ExtUtils-XSOne-Test-Calculator
view release on metacpan or search on metacpan
Calculator.xs view on Meta::CPAN
}
}
/* C code from: Calculator/Basic.xs */
#line 1 "lib/Acme/ExtUtils/XSOne/Test/Calculator/Basic.xs"
/*
* Acme::ExtUtils::XSOne::Test::Calculator::Basic - Basic arithmetic operations
*/
/* C helper functions for Basic package */
static double basic_safe_divide(double a, double b, int *error) {
if (b == 0.0) {
*error = 1;
return 0.0;
}
*error = 0;
return a / b;
}
static double basic_clamp(double value, double min_val, double max_val) {
if (value < min_val) return min_val;
if (value > max_val) return max_val;
return value;
}
static double basic_percent(double value, double percent) {
Calculator.xs view on Meta::CPAN
}
}
/* C code from: Calculator/Scientific.xs */
#line 1 "lib/Acme/ExtUtils/XSOne/Test/Calculator/Scientific.xs"
/*
* Acme::ExtUtils::XSOne::Test::Calculator::Scientific - Scientific/advanced operations
*/
/* C helper functions for Scientific package */
static double sci_safe_log(double a, int *error) {
if (a <= 0.0) {
*error = 1;
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;
Calculator.xs view on Meta::CPAN
RETVAL = fabs(a);
add_to_history('a', a, 0, RETVAL);
OUTPUT:
RETVAL
double
safe_divide(a, b)
double a
double b
CODE:
int error;
RETVAL = basic_safe_divide(a, b, &error);
if (error) {
RETVAL = 0.0; /* Return 0 instead of croak */
}
add_to_history('/', a, b, RETVAL);
OUTPUT:
RETVAL
double
clamp(value, min_val, max_val)
double value
double min_val
Calculator.xs view on Meta::CPAN
CODE:
RETVAL = sci_ipow(base, exp);
add_to_history('^', base, (double)exp, RETVAL);
OUTPUT:
RETVAL
double
safe_sqrt(a)
double a
CODE:
int error;
RETVAL = sci_safe_sqrt(a, &error);
if (!error) {
add_to_history('r', a, 0.5, RETVAL);
}
OUTPUT:
RETVAL
double
safe_log(a)
double a
CODE:
int error;
RETVAL = sci_safe_log(a, &error);
if (!error) {
add_to_history('l', a, M_E, RETVAL);
}
OUTPUT:
RETVAL
double
combination(n, r)
int n
int r
CODE:
lib/Acme/ExtUtils/XSOne/Test/Calculator/Basic.xs view on Meta::CPAN
/*
* Acme::ExtUtils::XSOne::Test::Calculator::Basic - Basic arithmetic operations
*/
#include <math.h>
/* C helper functions for Basic package */
static double basic_safe_divide(double a, double b, int *error) {
if (b == 0.0) {
*error = 1;
return 0.0;
}
*error = 0;
return a / b;
}
static double basic_clamp(double value, double min_val, double max_val) {
if (value < min_val) return min_val;
if (value > max_val) return max_val;
return value;
}
static double basic_percent(double value, double percent) {
lib/Acme/ExtUtils/XSOne/Test/Calculator/Basic.xs view on Meta::CPAN
RETVAL = fabs(a);
add_to_history('a', a, 0, RETVAL);
OUTPUT:
RETVAL
double
safe_divide(a, b)
double a
double b
CODE:
int error;
RETVAL = basic_safe_divide(a, b, &error);
if (error) {
RETVAL = 0.0; /* Return 0 instead of croak */
}
add_to_history('/', a, b, RETVAL);
OUTPUT:
RETVAL
double
clamp(value, min_val, max_val)
double value
double min_val
lib/Acme/ExtUtils/XSOne/Test/Calculator/Scientific.xs view on Meta::CPAN
/*
* Acme::ExtUtils::XSOne::Test::Calculator::Scientific - Scientific/advanced operations
*/
#include <math.h>
/* C helper functions for Scientific package */
static double sci_safe_log(double a, int *error) {
if (a <= 0.0) {
*error = 1;
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;
lib/Acme/ExtUtils/XSOne/Test/Calculator/Scientific.xs view on Meta::CPAN
CODE:
RETVAL = sci_ipow(base, exp);
add_to_history('^', base, (double)exp, RETVAL);
OUTPUT:
RETVAL
double
safe_sqrt(a)
double a
CODE:
int error;
RETVAL = sci_safe_sqrt(a, &error);
if (!error) {
add_to_history('r', a, 0.5, RETVAL);
}
OUTPUT:
RETVAL
double
safe_log(a)
double a
CODE:
int error;
RETVAL = sci_safe_log(a, &error);
if (!error) {
add_to_history('l', a, M_E, RETVAL);
}
OUTPUT:
RETVAL
double
combination(n, r)
int n
int r
CODE:
t/01-calculator.t view on Meta::CPAN
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::log10_val(100) - 2) < 0.0001, 'log10(100) = 2');
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::log_base(8, 2) - 3) < 0.0001, 'log2(8) = 3');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::nth_root(27, 3), 3, 'nth_root(27, 3) = 3');
# Test C helper function (defined in scientific.xs preamble)
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::safe_log(exp(1)) - 1) < 0.0001, 'safe_log(e) = 1');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::safe_log(-1), 0, 'safe_log(-1) = 0 (no croak)');
};
subtest 'Scientific error handling' => sub {
plan tests => 3;
eval { Acme::ExtUtils::XSOne::Test::Calculator::Scientific::sqrt_val(-1) };
like($@, qr/negative/, 'sqrt of negative croaks');
eval { Acme::ExtUtils::XSOne::Test::Calculator::Scientific::log_natural(-1) };
like($@, qr/non-positive/, 'log of negative croaks');
eval { Acme::ExtUtils::XSOne::Test::Calculator::Scientific::factorial(-1) };
like($@, qr/negative/, 'factorial of negative croaks');
t/02-import.t view on Meta::CPAN
ok(abs(log_natural(exp(1)) - 1) < 0.0001, 'ln(e) = 1');
ok(abs(log10_val(100) - 2) < 0.0001, 'log10(100) = 2');
ok(abs(log_base(8, 2) - 3) < 0.0001, 'log2(8) = 3');
is(nth_root(27, 3), 3, 'nth_root(27, 3) = 3');
ok(abs(safe_log(exp(1)) - 1) < 0.0001, 'safe_log(e) = 1');
is(safe_log(-1), 0, 'safe_log(-1) = 0 (no croak)');
};
subtest 'Scientific error handling' => sub {
plan tests => 3;
eval { sqrt_val(-1) };
like($@, qr/negative/, 'sqrt of negative croaks');
eval { log_natural(-1) };
like($@, qr/non-positive/, 'log of negative croaks');
eval { factorial(-1) };
like($@, qr/negative/, 'factorial of negative croaks');
( run in 0.748 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )