summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md16
-rw-r--r--mrbgems/mruby-math/test/math.rb201
-rw-r--r--src/class.c81
-rw-r--r--test/assert.rb3
4 files changed, 156 insertions, 145 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 08995978f..b8db5a7dc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,6 +1,6 @@
# How to contribute
-mruby is an open-source project which is looking forward to each contribution.
+mruby is an open-source project which is looking forward to each contribution.
## Your Pull Request
@@ -8,10 +8,10 @@ To make it easy to review and understand your change please keep the following
things in mind before submitting your pull request:
* Work on the latest possible state of **mruby/master**
-* Test your changes before creating a pull request (**make test**)
+* Create a branch which is dedicated to your change
+* Test your changes before creating a pull request (```./minirake test```)
* If possible write a test case which confirms your change
* Don't mix several features or bug-fixes in one pull request
-* Create a branch which is dedicated to your change
* Create a meaningful commit message
* Explain your change (i.e. with a link to the issue you are fixing)
@@ -27,16 +27,16 @@ C code:
#### Comply with C99 (ISO/IEC 9899:1999)
-mruby should be highly portable to other systems and compilers. For that it is
+mruby should be highly portable to other systems and compilers. For this it is
recommended to keep your code as close as possible to the C99 standard
(http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf).
-Although we target C99, VC is also an important target for mruby, so that we
-avoid local variable declaration in the middle.
+Although we target C99, Visual C++ is also an important target for mruby. For this
+reason a declaration of a local variable has to be at the beginning of a scope block.
#### Reduce library dependencies to a minimum
-The dependencies to libraries should be put to an absolute minimum. This
+The dependencies to libraries should be kept to an absolute minimum. This
increases the portability but makes it also easier to cut away parts of mruby
on-demand.
@@ -56,7 +56,7 @@ Use C++ style comments only for temporary comment e.g. commenting out some code
### Ruby code
-Parts of the standard library of mruby is written in the Ruby programming language
+Parts of the standard library of mruby are written in the Ruby programming language
itself. Please note the following hints for your Ruby code:
#### Comply with the Ruby standard (ISO/IEC 30170:2012)
diff --git a/mrbgems/mruby-math/test/math.rb b/mrbgems/mruby-math/test/math.rb
index 780b805d2..1cc3a20b0 100644
--- a/mrbgems/mruby-math/test/math.rb
+++ b/mrbgems/mruby-math/test/math.rb
@@ -1,125 +1,136 @@
##
# Math Test
-if Object.const_defined?(:Math)
- assert('Math.sin 0') do
- check_float(Math.sin(0), 0)
+##
+# Performs fuzzy check for equality on methods returning floats
+# on the basis of the Math::TOLERANCE constant.
+def check_float(a, b)
+ tolerance = Math::TOLERANCE
+ a = a.to_f
+ b = b.to_f
+ if a.finite? and b.finite?
+ (a-b).abs < tolerance
+ else
+ true
end
+end
- assert('Math.sin PI/2') do
- check_float(Math.sin(Math::PI / 2), 1)
- end
+assert('Math.sin 0') do
+ check_float(Math.sin(0), 0)
+end
- assert('Fundamental trig identities') do
- result = true
- N = 13
- N.times do |i|
- a = Math::PI / N * i
- ca = Math::PI / 2 - a
- s = Math.sin(a)
- c = Math.cos(a)
- t = Math.tan(a)
- result &= check_float(s, Math.cos(ca))
- result &= check_float(t, 1 / Math.tan(ca))
- result &= check_float(s ** 2 + c ** 2, 1)
- result &= check_float(t ** 2 + 1, (1/c) ** 2)
- result &= check_float((1/t) ** 2 + 1, (1/s) ** 2)
- end
- result
- end
+assert('Math.sin PI/2') do
+ check_float(Math.sin(Math::PI / 2), 1)
+end
- assert('Math.erf 0') do
- check_float(Math.erf(0), 0)
- end
+assert('Fundamental trig identities') do
+ result = true
+ N = 13
+ N.times do |i|
+ a = Math::PI / N * i
+ ca = Math::PI / 2 - a
+ s = Math.sin(a)
+ c = Math.cos(a)
+ t = Math.tan(a)
+ result &= check_float(s, Math.cos(ca))
+ result &= check_float(t, 1 / Math.tan(ca))
+ result &= check_float(s ** 2 + c ** 2, 1)
+ result &= check_float(t ** 2 + 1, (1/c) ** 2)
+ result &= check_float((1/t) ** 2 + 1, (1/s) ** 2)
+ end
+ result
+end
- assert('Math.exp 0') do
- check_float(Math.exp(0), 1.0)
- end
+assert('Math.erf 0') do
+ check_float(Math.erf(0), 0)
+end
- assert('Math.exp 1') do
- check_float(Math.exp(1), 2.718281828459045)
- end
+assert('Math.exp 0') do
+ check_float(Math.exp(0), 1.0)
+end
- assert('Math.exp 1.5') do
- check_float(Math.exp(1.5), 4.4816890703380645)
- end
+assert('Math.exp 1') do
+ check_float(Math.exp(1), 2.718281828459045)
+end
- assert('Math.log 1') do
- check_float(Math.log(1), 0)
- end
+assert('Math.exp 1.5') do
+ check_float(Math.exp(1.5), 4.4816890703380645)
+end
- assert('Math.log E') do
- check_float(Math.log(Math::E), 1.0)
- end
+assert('Math.log 1') do
+ check_float(Math.log(1), 0)
+end
- assert('Math.log E**3') do
- check_float(Math.log(Math::E**3), 3.0)
- end
+assert('Math.log E') do
+ check_float(Math.log(Math::E), 1.0)
+end
- assert('Math.log2 1') do
- check_float(Math.log2(1), 0.0)
- end
+assert('Math.log E**3') do
+ check_float(Math.log(Math::E**3), 3.0)
+end
- assert('Math.log2 2') do
- check_float(Math.log2(2), 1.0)
- end
+assert('Math.log2 1') do
+ check_float(Math.log2(1), 0.0)
+end
- assert('Math.log10 1') do
- check_float(Math.log10(1), 0.0)
- end
+assert('Math.log2 2') do
+ check_float(Math.log2(2), 1.0)
+end
- assert('Math.log10 10') do
- check_float(Math.log10(10), 1.0)
- end
+assert('Math.log10 1') do
+ check_float(Math.log10(1), 0.0)
+end
- assert('Math.log10 10**100') do
- check_float(Math.log10(10**100), 100.0)
- end
+assert('Math.log10 10') do
+ check_float(Math.log10(10), 1.0)
+end
- assert('Math.sqrt') do
- num = [0.0, 1.0, 2.0, 3.0, 4.0]
- sqr = [0, 1, 4, 9, 16]
- result = true
- sqr.each_with_index do |v,i|
- result &= check_float(Math.sqrt(v), num[i])
- end
- result
- end
+assert('Math.log10 10**100') do
+ check_float(Math.log10(10**100), 100.0)
+end
- assert('Math.cbrt') do
- num = [-2.0, -1.0, 0.0, 1.0, 2.0]
- cub = [-8, -1, 0, 1, 8]
- result = true
- cub.each_with_index do |v,i|
- result &= check_float(Math.cbrt(v), num[i])
- end
- result
+assert('Math.sqrt') do
+ num = [0.0, 1.0, 2.0, 3.0, 4.0]
+ sqr = [0, 1, 4, 9, 16]
+ result = true
+ sqr.each_with_index do |v,i|
+ result &= check_float(Math.sqrt(v), num[i])
end
+ result
+end
- assert('Math.hypot') do
- check_float(Math.hypot(3, 4), 5.0)
+assert('Math.cbrt') do
+ num = [-2.0, -1.0, 0.0, 1.0, 2.0]
+ cub = [-8, -1, 0, 1, 8]
+ result = true
+ cub.each_with_index do |v,i|
+ result &= check_float(Math.cbrt(v), num[i])
end
+ result
+end
- assert('Math.frexp 1234') do
- n = 1234
- fraction, exponent = Math.frexp(n)
- check_float(Math.ldexp(fraction, exponent), n)
- end
+assert('Math.hypot') do
+ check_float(Math.hypot(3, 4), 5.0)
+end
- assert('Math.erf 1') do
- check_float(Math.erf(1), 0.842700792949715)
- end
+assert('Math.frexp 1234') do
+ n = 1234
+ fraction, exponent = Math.frexp(n)
+ check_float(Math.ldexp(fraction, exponent), n)
+end
- assert('Math.erfc 1') do
- check_float(Math.erfc(1), 0.157299207050285)
- end
+assert('Math.erf 1') do
+ check_float(Math.erf(1), 0.842700792949715)
+end
- assert('Math.erf -1') do
- check_float(Math.erf(-1), -0.8427007929497148)
- end
+assert('Math.erfc 1') do
+ check_float(Math.erfc(1), 0.157299207050285)
+end
- assert('Math.erfc -1') do
- check_float(Math.erfc(-1), 1.8427007929497148)
- end
+assert('Math.erf -1') do
+ check_float(Math.erf(-1), -0.8427007929497148)
end
+assert('Math.erfc -1') do
+ check_float(Math.erfc(-1), 1.8427007929497148)
+end
diff --git a/src/class.c b/src/class.c
index e70bd7e73..c2def3e8c 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1777,9 +1777,9 @@ mrb_init_class(mrb_state *mrb)
/* name basic classes */
mrb_define_const(mrb, bob, "BasicObject", mrb_obj_value(bob));
mrb_define_const(mrb, obj, "BasicObject", mrb_obj_value(bob));
- mrb_define_const(mrb, obj, "Object", mrb_obj_value(obj));
- mrb_define_const(mrb, obj, "Module", mrb_obj_value(mod));
- mrb_define_const(mrb, obj, "Class", mrb_obj_value(cls));
+ mrb_define_const(mrb, obj, "Object", mrb_obj_value(obj));
+ mrb_define_const(mrb, obj, "Module", mrb_obj_value(mod));
+ mrb_define_const(mrb, obj, "Class", mrb_obj_value(cls));
/* name each classes */
mrb_name_class(mrb, bob, mrb_intern(mrb, "BasicObject"));
@@ -1789,43 +1789,44 @@ mrb_init_class(mrb_state *mrb)
mrb_undef_method(mrb, mod, "new");
MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
- mrb_define_method(mrb, bob, "initialize", mrb_bob_init, ARGS_NONE());
- mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE());
- mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */
- mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, ARGS_ANY());
- mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); /* 15.2.3.3.4 */
- mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */
- mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1));
- mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined, ARGS_REQ(1)); /* 15.2.2.4.16 */
- mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, ARGS_REQ(1)); /* 15.2.2.4.17 */
- mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, ARGS_REQ(2)); /* 15.2.2.4.18 */
- mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, ARGS_REQ(1)); /* 15.2.2.4.25 */
- mrb_define_method(mrb, mod, "extended", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.26 */
- mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */
- mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, ARGS_REQ(1)); /* 15.2.2.4.28 */
- mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */
- mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.15 */
- mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */
- mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */
- mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, ARGS_ANY()); /* 15.2.2.4.33 */
- mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, ARGS_REQ(1)); /* 15.2.2.4.34 */
- mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.35 */
- mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, ARGS_REQ(1)); /* 15.2.2.4.39 */
- mrb_define_method(mrb, mod, "remove_method", mrb_mod_remove_method, ARGS_ANY()); /* 15.2.2.4.41 */
-
- mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE());
- mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, ARGS_NONE());
- mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY()); /* 15.2.2.4.8 */
- mrb_define_method(mrb, mod, "ancestors", mrb_mod_ancestors, ARGS_NONE()); /* 15.2.2.4.9 */
- mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, ARGS_ANY()); /* 15.2.2.4.41 */
- mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1)); /* 15.2.2.4.20 */
- mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1)); /* 15.2.2.4.21 */
- mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, ARGS_REQ(2)); /* 15.2.2.4.23 */
- mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, ARGS_REQ(1)); /* 15.2.2.4.40 */
- mrb_define_method(mrb, mod, "define_method", mod_define_method, ARGS_REQ(1));
- mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, ARGS_NONE()); /* 15.2.2.4.19 */
-
- mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1));
+ mrb_define_method(mrb, bob, "initialize", mrb_bob_init, ARGS_NONE());
+ mrb_define_method(mrb, bob, "!", mrb_bob_not, ARGS_NONE());
+ mrb_define_method(mrb, bob, "method_missing", mrb_bob_missing, ARGS_ANY()); /* 15.3.1.3.30 */
+
+ mrb_define_class_method(mrb, cls, "new", mrb_class_new_class, ARGS_ANY());
+ mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); /* 15.2.3.3.4 */
+ mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */
+ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1));
+
+ mrb_define_method(mrb, mod, "class_variable_defined?", mrb_mod_cvar_defined, ARGS_REQ(1)); /* 15.2.2.4.16 */
+ mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, ARGS_REQ(1)); /* 15.2.2.4.17 */
+ mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, ARGS_REQ(2)); /* 15.2.2.4.18 */
+ mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, ARGS_REQ(1)); /* 15.2.2.4.25 */
+ mrb_define_method(mrb, mod, "extended", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.26 */
+ mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */
+ mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, ARGS_REQ(1)); /* 15.2.2.4.28 */
+ mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */
+ mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.15 */
+ mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */
+ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */
+ mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, ARGS_ANY()); /* 15.2.2.4.33 */
+ mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, ARGS_REQ(1)); /* 15.2.2.4.34 */
+ mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.35 */
+ mrb_define_method(mrb, mod, "remove_class_variable", mrb_mod_remove_cvar, ARGS_REQ(1)); /* 15.2.2.4.39 */
+ mrb_define_method(mrb, mod, "remove_method", mrb_mod_remove_method, ARGS_ANY()); /* 15.2.2.4.41 */
+ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE());
+ mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, ARGS_NONE());
+ mrb_define_method(mrb, mod, "alias_method", mrb_mod_alias, ARGS_ANY()); /* 15.2.2.4.8 */
+ mrb_define_method(mrb, mod, "ancestors", mrb_mod_ancestors, ARGS_NONE()); /* 15.2.2.4.9 */
+ mrb_define_method(mrb, mod, "undef_method", mrb_mod_undef, ARGS_ANY()); /* 15.2.2.4.41 */
+ mrb_define_method(mrb, mod, "const_defined?", mrb_mod_const_defined, ARGS_REQ(1)); /* 15.2.2.4.20 */
+ mrb_define_method(mrb, mod, "const_get", mrb_mod_const_get, ARGS_REQ(1)); /* 15.2.2.4.21 */
+ mrb_define_method(mrb, mod, "const_set", mrb_mod_const_set, ARGS_REQ(2)); /* 15.2.2.4.23 */
+ mrb_define_method(mrb, mod, "remove_const", mrb_mod_remove_const, ARGS_REQ(1)); /* 15.2.2.4.40 */
+ mrb_define_method(mrb, mod, "define_method", mod_define_method, ARGS_REQ(1));
+ mrb_define_method(mrb, mod, "class_variables", mrb_mod_class_variables, ARGS_NONE()); /* 15.2.2.4.19 */
+ mrb_define_method(mrb, mod, "===", mrb_mod_eqq, ARGS_REQ(1));
+
mrb_undef_method(mrb, cls, "append_features");
mrb_undef_method(mrb, cls, "extend_object");
}
diff --git a/test/assert.rb b/test/assert.rb
index 269c435a7..86e99db5c 100644
--- a/test/assert.rb
+++ b/test/assert.rb
@@ -151,9 +151,8 @@ end
##
# Performs fuzzy check for equality on methods returning floats
-# on the basis of the Math::TOLERANCE constant.
def check_float(a, b)
- tolerance = Math::TOLERANCE
+ tolerance = 1e-12
a = a.to_f
b = b.to_f
if a.finite? and b.finite?