From 99d0354e89aefdb6373dbeb22506216b8790a0bd Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 16 Jan 1998 12:13:05 +0000 Subject: Initial revision git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@2 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- math.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 math.c (limited to 'math.c') diff --git a/math.c b/math.c new file mode 100644 index 000000000..7b75a0110 --- /dev/null +++ b/math.c @@ -0,0 +1,135 @@ +/************************************************ + + math.c - + + $Author$ + $Date$ + created at: Tue Jan 25 14:12:56 JST 1994 + + Copyright (C) 1993-1996 Yukihiro Matsumoto + +************************************************/ + +#include "ruby.h" +#include + +VALUE mMath; +VALUE float_new(); +VALUE f_float(); + +#define Need_Float(x) \ +if (FIXNUM_P(x)) {\ + (x) = (struct RFloat*)float_new((double)FIX2INT(x));\ +} else {\ + (x) = (struct RFloat*)f_float(x, x);\ +} + +#define Need_Float2(x,y) {\ + Need_Float(x);\ + Need_Float(y);\ +} + +static VALUE +math_atan2(obj, x, y) + VALUE obj; + struct RFloat *x, *y; +{ + Need_Float2(x, y); + return float_new(atan2(x->value, y->value)); +} + +static VALUE +math_cos(obj, x) + VALUE obj; + struct RFloat *x; +{ + Need_Float(x); + + return float_new(cos(x->value)); +} + +static VALUE +math_sin(obj, x) + VALUE obj; + struct RFloat *x; +{ + Need_Float(x); + + return float_new(sin(x->value)); +} + +static VALUE +math_tan(obj, x) + VALUE obj; + struct RFloat *x; +{ + Need_Float(x); + + return float_new(tan(x->value)); +} + +static VALUE +math_exp(obj, x) + VALUE obj; + struct RFloat *x; +{ + Need_Float(x); + return float_new(exp(x->value)); +} + +static VALUE +math_log(obj, x) + VALUE obj; + struct RFloat *x; +{ + Need_Float(x); + return float_new(log(x->value)); +} + +static VALUE +math_log10(obj, x) + VALUE obj; + struct RFloat *x; +{ + Need_Float(x); + return float_new(log10(x->value)); +} + +static VALUE +math_sqrt(obj, x) + VALUE obj; + struct RFloat *x; +{ + Need_Float(x); + + if (x->value < 0.0) ArgError("square root for negative number"); + return float_new(sqrt(x->value)); +} + +void +Init_Math() +{ + mMath = rb_define_module("Math"); + +#ifdef M_PI + rb_define_const(mMath, "PI", float_new(M_PI)); +#else + rb_define_const(mMath, "PI", float_new(atan(1.0)*4.0)); +#endif + +#ifdef M_E + rb_define_const(mMath, "E", float_new(M_E)); +#else + rb_define_const(mMath, "E", float_new(exp(1.0))); +#endif + + rb_define_module_function(mMath, "atan2", math_atan2, 2); + rb_define_module_function(mMath, "cos", math_cos, 1); + rb_define_module_function(mMath, "sin", math_sin, 1); + rb_define_module_function(mMath, "tan", math_tan, 1); + + rb_define_module_function(mMath, "exp", math_exp, 1); + rb_define_module_function(mMath, "log", math_log, 1); + rb_define_module_function(mMath, "log10", math_log10, 1); + rb_define_module_function(mMath, "sqrt", math_sqrt, 1); +} -- cgit