Change soft-fail to use the config, rather than env
[rbx.git] / kernel / core / math.rb
blob95029dd5fd01ec310a597eb3f00e94626dbddf36
1 # depends on: module.rb
3 module Math
4   # Constants
5   PI = 3.14159_26535_89793_23846
6   E  = 2.71828_18284_59045_23536
7   
8   def atan2(y, x)
9     Platform::Math.atan2 Float(y), Float(x)
10   end
11   
12   def cos(x)
13     Platform::Math.cos Float(x)
14   end
15   
16   def sin(x)
17     Platform::Math.sin Float(x)
18   end
19   
20   def tan(x)
21     Platform::Math.tan Float(x)
22   end
23   
24   def acos(x)
25     x = Float(x)
26     verify_domain('acos') { x.abs <= 1.0 }
28     Platform::POSIX.errno = 0
30     ret = Platform::Math.acos x
31     Errno.handle
32     ret
33   end
34   
35   def asin(x)
36     x = Float(x)
37     verify_domain('asin') { x.abs <= 1.0 }
38     Platform::Math.asin x
39   end
40   
41   def atan(x)
42     Platform::Math.atan Float(x)
43   end
44   
45   def cosh(x)
46     Platform::Math.cosh Float(x)
47   end
48   
49   def sinh(x)
50     Platform::Math.sinh Float(x)
51   end
52   
53   def tanh(x)
54     Platform::Math.tanh Float(x)
55   end
56   
57   def acosh(x)
58     x = Float(x)
59     verify_domain('acosh') { x >= 1.0 }
60     Platform::Math.acosh x
61   end
62   
63   def asinh(x)
64     Platform::Math.asinh Float(x)
65   end
66   
67   def atanh(x)
68     x = Float(x)
69     verify_domain('atanh') { x.abs <= 1.0 }
71     Platform::POSIX.errno = 0
73     ret = Platform::Math.atanh x
74     Errno.handle
75     ret
76   end
77   
78   def exp(x)
79     Platform::Math.exp Float(x)
80   end
81   
82   def log(x, base=nil)
83     x = Float(x)
84     verify_domain('log') { x >= 0.0 }
85     result = Platform::Math.log x
86     result /= Platorm::Math.log Float(base) if base
87     return result
88   end
89   
90   def log2(x)
91     x = Float(x)
92     verify_domain('log2') { x >= 0.0 }
93     Platform::Math.log2 x
94   end
95   
96   def log10(x)
97     x = Float(x)
98     verify_domain('log10') { x >= 0.0 }
99     Platform::Math.log10 x
100   end
101   
102   def sqrt(x)
103     x = Float(x)
104     verify_domain('sqrt') { x >= 0.0 }
105     Platform::Math.sqrt x
106   end
107   
108   def frexp(x)
109     x = Float(x)
110     MemoryPointer.new :int do |exp|
111       result = Platform::Math.frexp x, exp
112       [result, exp.read_int]
113     end
114   end
115   
116   def ldexp(x, n)
117     n = Type.coerce_to(n, Integer, :to_int)
119     Platform::Math.ldexp Float(x), n
120   end
121   
122   def hypot(x, y)
123     Platform::Math.hypot Float(x), Float(y)
124   end
125   
126   def erf(x)
127     Platform::Math.erf Float(x)
128   end
129   
130   def erfc(x)
131     Platform::Math.erfc Float(x)
132   end
133   
134   def verify_domain(msg)
135     unless yield
136       raise Errno::EDOM, msg if Errno.const_defined?(:EDOM)
137       raise Errno::ERANGE, msg if Errno.const_defined?(:ERANGE)
138     end
139   end
140   
141   def self.after_loaded
142     module_function :verify_domain, :atan2, :cos, :sin, :tan, :acos, :asin, :atan,
143                     :cosh, :sinh, :tanh, :acosh, :asinh, :atanh, :exp, :log, :log2,
144                     :log10, :sqrt, :frexp, :ldexp, :hypot, :erf, :erfc
145       
146     private :verify_domain, :atan2, :cos, :sin, :tan, :acos, :asin, :atan,
147             :cosh, :sinh, :tanh, :acosh, :asinh, :atanh, :exp, :log, :log2,
148             :log10, :sqrt, :frexp, :ldexp, :hypot, :erf, :erfc
149   end