ruby-mpc 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,43 @@
1
+ #ifndef _RUBY_MPC_H_
2
+ #define _RUBY_MPC_H_
3
+
4
+ #include <stdio.h>
5
+ #include <ruby.h>
6
+ #include <mpfr.h>
7
+ #include <mpc.h>
8
+ #include "ruby_mpfr.h"
9
+
10
+ typedef __mpc_struct MPC;
11
+
12
+ VALUE r_mpc_class, r_mpc_math;
13
+
14
+ #define r_mpc_make_struct(ruby_var, c_var) { ruby_var = Data_Make_Struct(r_mpc_class, MPC, 0, r_mpc_free, c_var); }
15
+ #define r_mpc_make_struct_init(ruby_var, c_var) { r_mpc_make_struct(ruby_var, c_var); mpc_init2(c_var, mpfr_get_default_prec()); }
16
+ #define r_mpc_make_struct_init2(ruby_var, c_var, prec) { r_mpc_make_struct(ruby_var, c_var); mpc_init2(c_var, prec); }
17
+ #define r_mpc_get_struct(c_var, ruby_var) { Data_Get_Struct(ruby_var, MPC, c_var); }
18
+
19
+ #define r_mpc_temp_alloc(c_var) { c_var=ALLOC_N(MPC, 1); }
20
+ #define r_mpc_temp_alloc_init(c_var) { r_mpc_temp_alloc(c_var); mpc_init2(c_var, mpfr_get_default_prec()); }
21
+ #define r_mpc_temp_alloc_init2(c_var, prec) { r_mpc_temp_alloc(c_var); mpc_init2(c_var, prec); }
22
+ #define r_mpc_temp_free(c_var) { mpc_clear(c_var); free(c_var); }
23
+
24
+ #define r_mpc_rnd_from_value(rnd) (mp_rnd_t)NUM2INT(rnd)
25
+
26
+ void r_mpc_free(void *ptr);
27
+ VALUE r_mpc_new_c_obj(VALUE obj);
28
+ /* VALUE r_mpc_new_robj(MPC *ptr); */
29
+ /* void r_mpc_set_robj(MPC *ptr, VALUE obj); */
30
+
31
+ /* Arguments */
32
+ mpc_rnd_t r_mpc_rnd_from_optional_argument(int min, int max, int argc, VALUE *argv);
33
+ mpc_rnd_t r_mpc_prec_from_optional_argument(int min, int max, int argc, VALUE *argv);
34
+ void r_mpc_get_rnd_prec_from_optional_arguments(mpc_rnd_t *rnd, mp_prec_t *prec, int min, int max,
35
+ int argc, VALUE *argv);
36
+
37
+ void rb_mpc_extended_set_default_rounding_mode (mpc_rnd_t rnd_mode);
38
+ mpc_rnd_t rb_mpc_extended_get_default_rounding_mode (void);
39
+ mp_prec_t rb_mpc_extended_get_max_prec (mpc_t x);
40
+ void r_mpc_set_c_function_state(int num);
41
+ void r_mpc_set_fr_function_state(int num);
42
+
43
+ #endif /* _RUBY_MPC_H_ */
@@ -0,0 +1,38 @@
1
+ #ifndef _RUBY_MPFR_H_
2
+ #define _RUBY_MPFR_H_
3
+
4
+ #include <ruby.h>
5
+ #include <mpfr.h>
6
+ #include <stdio.h>
7
+
8
+ typedef __mpfr_struct MPFR;
9
+
10
+ VALUE r_mpfr_class, r_mpfr_math;
11
+
12
+ #define r_mpfr_make_struct(ruby_var, c_var) { ruby_var = Data_Make_Struct(r_mpfr_class, MPFR, 0, r_mpfr_free, c_var); }
13
+ #define r_mpfr_make_struct_init(ruby_var, c_var) { r_mpfr_make_struct(ruby_var, c_var); mpfr_init(c_var); }
14
+ #define r_mpfr_make_struct_init2(ruby_var, c_var, prec) { r_mpfr_make_struct(ruby_var, c_var); mpfr_init2(c_var, prec); }
15
+ #define r_mpfr_get_struct(c_var, ruby_var) { Data_Get_Struct(ruby_var, MPFR, c_var); }
16
+
17
+ #define r_mpfr_temp_alloc(var) { var=ALLOC_N(MPFR, 1); }
18
+ #define r_mpfr_temp_alloc_init(var) { r_mpfr_temp_alloc(var); mpfr_init(var); }
19
+ #define r_mpfr_temp_alloc_init2(var, prec) { r_mpfr_temp_alloc(var); mpfr_init2(var, prec); }
20
+ #define r_mpfr_temp_free(var) { mpfr_clear(var); free(var); }
21
+
22
+ #define r_mpfr_check_number(c_val) { if(mpfr_number_p(c_val) == 0) rb_raise(rb_eArgError, "Not an ordinary number."); }
23
+ #define r_mpfr_check_positive_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) <= 0) rb_raise(rb_eArgError, "Not a positive number."); }
24
+ #define r_mpfr_check_non_negative_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) < 0) rb_raise(rb_eArgError, "Not a non negative number."); }
25
+ #define r_mpfr_check_negative_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) >= 0) rb_raise(rb_eArgError, "Not a negative number."); }
26
+ #define r_mpfr_check_non_positive_number(c_val) { if(mpfr_number_p(c_val) == 0 && mpfr_sgn(c_val) > 0) rb_raise(rb_eArgError, "Not a non positive number."); }
27
+
28
+ void r_mpfr_free(void *ptr);
29
+ VALUE r_mpfr_new_fr_obj(VALUE obj);
30
+ void r_mpfr_set_robj(MPFR *ptr, VALUE obj, mp_rnd_t rnd);
31
+
32
+ mp_rnd_t r_mpfr_rnd_from_value(VALUE rnd);
33
+ mp_rnd_t r_mpfr_rnd_from_optional_argument(int min, int max, int argc, VALUE *argv);
34
+ mp_rnd_t r_mpfr_prec_from_optional_argument(int min, int max, int argc, VALUE *argv);
35
+ void r_mpfr_get_rnd_prec_from_optional_arguments(mp_rnd_t *rnd, mp_prec_t *prec, int min, int max, int argc, VALUE *argv);
36
+
37
+ #endif /* _RUBY_MPFR_H_ */
38
+
@@ -0,0 +1,3 @@
1
+ module MPC
2
+ VERSION = '0.0.2'
3
+ end
data/ruby-mpc.gemspec ADDED
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{ruby-mpc}
5
+ s.version = "0.0.2"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Takayuki YAMAGUCHI"]
9
+ s.date = %q{2009-12-17}
10
+ s.description = %q{FIX (describe your package)}
11
+ s.email = ["d@ytak.info"]
12
+ s.extensions = ["ext/mpc/extconf.rb"]
13
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt"]
14
+ s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "ext/mpc/extconf.rb", "ext/mpc/ruby_mpc.c", "ext/mpc/ruby_mpc.h", "ext/mpc/ruby_mpfr.h", "lib/mpc/version.rb", "ruby-mpc.gemspec", "script/console", "script/destroy", "script/generate", "spec/mpc/arithmetic_op_spec.rb", "spec/mpc/const_spec.rb", "spec/mpc/functions_spec.rb", "spec/mpc/generate_complex_number.rb", "spec/mpc/spec_helper.rb", "spec/spec.opts", "tasks/extconf.rake"]
15
+ s.homepage = %q{http://github.com/#{github_username}/#{project_name}}
16
+ s.post_install_message = %q{PostInstall.txt}
17
+ s.rdoc_options = ["--main", "README.rdoc"]
18
+ s.require_paths = ["lib", "ext"]
19
+ s.rubyforge_project = %q{ruby-mpc}
20
+ s.rubygems_version = %q{1.3.5}
21
+ s.summary = %q{FIX (describe your package)}
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 3
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ s.add_development_dependency(%q<hoe>, [">= 2.4.0"])
29
+ else
30
+ s.add_dependency(%q<hoe>, [">= 2.4.0"])
31
+ end
32
+ else
33
+ s.add_dependency(%q<hoe>, [">= 2.4.0"])
34
+ end
35
+ end
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/ruby-mpc.rb'}"
9
+ puts "Loading ruby-mpc gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ require "generate_complex_number.rb"
4
+
5
+ MPFR.set_default_prec(256)
6
+
7
+ ARITHMETIC_NUM_OF_CALCULATE = 1000
8
+
9
+ def check_mpc_arithmetic_op(arg1, arg2, error = 10e-10, &block)
10
+ ruby_res = yield(Complex(*(arg1.map{ |a| a.to_f })), Complex(*(arg2.map{ |a| a.to_f })))
11
+ mpc_res = yield(MPC.new(*arg1), MPC.new(*arg2))
12
+ (MPFR.new(ruby_res.real) - mpc_res.real).abs.should < error
13
+ (MPFR.new(ruby_res.imag) - mpc_res.imag).abs.should < error
14
+ end
15
+
16
+ describe MPC, "when calculating" do
17
+ it "should be complex number" do
18
+ args = GenerateComplex.float_arguments(ARITHMETIC_NUM_OF_CALCULATE)
19
+ args.each_index do |i|
20
+ if i > 0
21
+ check_mpc_arithmetic_op(args[i-1], args[i]){ |a, b| a + b }
22
+ check_mpc_arithmetic_op(args[i-1], args[i]){ |a, b| a - b }
23
+ check_mpc_arithmetic_op(args[i-1], args[i]){ |a, b| a * b }
24
+ check_mpc_arithmetic_op(args[i-1], args[i]){ |a, b| a / b }
25
+ end
26
+ end
27
+ end
28
+
29
+ end
30
+
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe MPC, "when returning constants" do
4
+ it "should have constants" do
5
+ constants = MPC.constants
6
+ [:RNDNN, :RNDNZ, :RNDNU, :RNDND, :RNDZN, :RNDZZ, :RNDZU, :RNDZD,
7
+ :RNDUN, :RNDUZ, :RNDUU, :RNDUD, :RNDDN, :RNDDZ, :RNDDU, :RNDDD].each do |cst|
8
+ constants.include?(cst).should be_true
9
+ eval("MPC::#{cst}").should be_instance_of Fixnum
10
+ end
11
+
12
+ [:VERSION_MAJOR, :VERSION_MINOR, :VERSION_PATCHLEVEL].each do |cst|
13
+ constants.include?(cst).should be_true
14
+ eval("MPC::#{cst}").should be_instance_of Fixnum
15
+ end
16
+
17
+ constants.include?(:VERSION_STRING).should be_true
18
+ MPC::VERSION_STRING.should be_instance_of String
19
+ end
20
+
21
+ end
22
+
23
+
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ require "generate_complex_number.rb"
4
+
5
+ MPFR.set_default_prec(512)
6
+
7
+ FUNCTIONS_NUM_OF_CALCULATE = 100
8
+
9
+ def check_mpc_function(arg1, error = 10e-10, &block)
10
+ ruby_res = yield(Complex(*(arg1.map{ |a| a.to_f })))
11
+ mpc_res = yield(MPC.new(*arg1))
12
+ if MPC === mpc_res
13
+ (MPFR.new(ruby_res.real) - mpc_res.real).abs.should < error
14
+ (MPFR.new(ruby_res.imag) - mpc_res.imag).abs.should < error
15
+ elsif MPFR === mpc_res
16
+ (MPFR.new(ruby_res) - mpc_res).abs.should < error
17
+ end
18
+ end
19
+
20
+ describe MPC, "when calculating some functions" do
21
+ it "should be the same result as Complex class" do
22
+ args = GenerateComplex.float_arguments(FUNCTIONS_NUM_OF_CALCULATE)
23
+ args.each do |a|
24
+ check_mpc_function(a) { |b| b.abs }
25
+ check_mpc_function(a) { |b| b.arg }
26
+ check_mpc_function(a) { |b| b.conj }
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,29 @@
1
+ module GenerateComplex
2
+
3
+ def self.float_arguments(number, max = 100)
4
+ ret = Array.new(number){ |j| Array.new(2){ |i| rand(max) - rand } }
5
+ for i in 0...(ret.size)
6
+ case i % 4
7
+ when 1
8
+ ret[i].map!{ |a| -a }
9
+ when 2, 3
10
+ ret[i].map!{ |a| (rand > 0.5 ? -a : a) }
11
+ end
12
+ end
13
+ ret
14
+ end
15
+
16
+ MAX_NUMBER = 1000
17
+
18
+ def self.string_arguments(number)
19
+ prec = MPFR.get_default_prec
20
+ max = 2 ** prec
21
+ Array.new(number) do |i|
22
+ sign1 = ((rand > 0.5 ? '-' : ''))
23
+ sign2 = ((rand > 0.5 ? '-' : ''))
24
+ ["#{sign1}#{rand(MAX_NUMBER)}.#{rand(max)}", "#{sign2}#{rand(MAX_NUMBER)}.#{rand(max)}"]
25
+ end
26
+ end
27
+
28
+
29
+ end
@@ -0,0 +1,16 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../../lib')
10
+ $:.unshift(*Dir.glob(File.dirname(__FILE__) + '/../../ext/*'))
11
+ $:.unshift(File.dirname(__FILE__))
12
+
13
+ require 'mpfr'
14
+ require 'mpc'
15
+ require "generate_complex_number"
16
+
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,36 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run 'make realclean' for extended libraries"
18
+ task "ext:realclean" do
19
+ Dir.glob("ext/**/Makefile").each do |path|
20
+ system("cd #{File.dirname(path)}; make realclean")
21
+ end
22
+ end
23
+
24
+ desc "Run 'make clean' for extended libraries"
25
+ task "ext:clean" do
26
+ Dir.glob("ext/**/Makefile").each do |path|
27
+ system("cd #{File.dirname(path)}; make clean")
28
+ end
29
+ end
30
+
31
+ desc "Run 'make realclean' for extended libraries"
32
+ task 'ext:make' do
33
+ Dir.glob("ext/**/extconf.rb").each do |path|
34
+ system("cd #{File.dirname(path)}; ruby extconf.rb && make")
35
+ end
36
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-mpc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Takayuki YAMAGUCHI
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-17 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.4.0
24
+ version:
25
+ description: FIX (describe your package)
26
+ email:
27
+ - d@ytak.info
28
+ executables: []
29
+
30
+ extensions:
31
+ - ext/mpc/extconf.rb
32
+ extra_rdoc_files:
33
+ - History.txt
34
+ - Manifest.txt
35
+ - PostInstall.txt
36
+ files:
37
+ - History.txt
38
+ - Manifest.txt
39
+ - PostInstall.txt
40
+ - README.rdoc
41
+ - Rakefile
42
+ - ext/mpc/extconf.rb
43
+ - ext/mpc/ruby_mpc.c
44
+ - ext/mpc/ruby_mpc.h
45
+ - ext/mpc/ruby_mpfr.h
46
+ - lib/mpc/version.rb
47
+ - ruby-mpc.gemspec
48
+ - script/console
49
+ - script/destroy
50
+ - script/generate
51
+ - spec/mpc/arithmetic_op_spec.rb
52
+ - spec/mpc/const_spec.rb
53
+ - spec/mpc/functions_spec.rb
54
+ - spec/mpc/generate_complex_number.rb
55
+ - spec/mpc/spec_helper.rb
56
+ - spec/spec.opts
57
+ - tasks/extconf.rake
58
+ has_rdoc: true
59
+ homepage: http://github.com/#{github_username}/#{project_name}
60
+ licenses: []
61
+
62
+ post_install_message: PostInstall.txt
63
+ rdoc_options:
64
+ - --main
65
+ - README.rdoc
66
+ require_paths:
67
+ - lib
68
+ - ext
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ requirements: []
82
+
83
+ rubyforge_project: ruby-mpc
84
+ rubygems_version: 1.3.5
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: FIX (describe your package)
88
+ test_files: []
89
+