diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-01-16 12:13:05 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-01-16 12:13:05 +0000 |
commit | 3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4 (patch) | |
tree | b3c086e437cab449f90ba637710daed0ddfec4c4 /math.c | |
parent | 392296c12de9d7f9be03a8205250ba0844cb9d38 (diff) | |
download | ruby-3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4.tar.gz |
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'math.c')
-rw-r--r-- | math.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/math.c b/math.c new file mode 100644 index 0000000000..7b75a0110e --- /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 <math.h> + +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); +} |