File: emath.rb

package info (click to toggle)
ruby-numru-misc 0.1.2-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 180 kB
  • sloc: ruby: 592; csh: 5; makefile: 2
file content (77 lines) | stat: -rw-r--r-- 2,119 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

module NumRu
  module Misc

    # To be included instead of the Math predefined module (or NMath in NArray).
    # Unlike Math and NMath, EMath handles unknown classes by calling its
    # native instance method (assuming the same name).
    # 
    # Therefore, if included, its function (module method) is used as:
    # 
    #    cos( obj )
    # 
    # and so on. If obj is not of a supported class, EMath calls, obj.cos in
    # this case.  (If cos is not a method of obj, then an exception is
    # raised.)  Supported classes are Numeric (by Math) and NArray (by
    # NMath).  EMath stands for "good Math" (for obvious reason for a
    # Japanese).
    # 
    # Note: as for atan2(a,b), a.atan2(b) will be called if a or b
    # is not supported. This is the case for all functions that take
    # two or more arguments.
    # 
    # require "narray"
    # require "cmath" if RUBY_VERSION.to_f > 1.8
    module EMath

      E = Math::E
      PI = Math::PI

      funcs = ["acos", "acosh", "asin", "asinh", "atan", "atan2", "atanh", 
               "cos", "cosh", "erf", "erfc", "exp", "frexp", "hypot", 
               "ldexp", "log", "log10", "sin", "sinh", "sqrt", "tan", "tanh"]
               # FUNCS: from ruby 1.8.0, ( Math.methods - Object.methods ).sort

      module_function
      funcs.each{|func|
	eval <<-EOS,nil,__FILE__,__LINE__+1
	def #{func}(*arg)
          case arg[0]
          when Numeric
        if RUBY_VERSION.to_f > 1.8
	    CMath.#{func}(*arg)
        else
	    Math.#{func}(*arg)
        end
	  when NArray
	    NMath.#{func}(*arg)
	  else
	    obj = arg.shift
	    begin
	      obj.#{func}(*arg)
	    rescue NameError
	      raise TypeError,"cannot handle \#{obj.class}: \#{obj.inspect}"
	    end
	  end
	end
	EOS
      }
    end
  end
end

if __FILE__ == $0
  include NumRu::Misc::EMath
  p cos( PI )
  p cos( Complex(0, 1) )
  p cos( NArray[0,PI/3,PI/2] )
  p cos( NArray[ Complex(1,0), Complex(0,1) ] )
  begin
    p cos( "ggg" )
  rescue
    print "* error as expected >>: ",$!,"\n"
  end
  require 'narray_miss'
  nam = NArrayMiss.to_nam( NArray[0,PI/3,PI/2] )
  p cos(nam)
end