ruby-mpc 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+