1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

math: make consts and structs public

This commit is contained in:
Alexander Medvednikov 2019-10-28 16:33:32 +03:00
parent ddcd1d2cec
commit 9e9935acbc
2 changed files with 37 additions and 37 deletions

View File

@ -4,9 +4,9 @@
module complex module complex
import math import math
struct Complex { pub struct Complex {
pub: pub:
re f64 re f64
im f64 im f64
@ -17,7 +17,7 @@ pub fn complex(re f64, im f64) Complex {
} }
// To String method // To String method
pub fn (c Complex) str() string { pub fn (c Complex) str() string {
mut out := '$c.re' mut out := '$c.re'
out += if c.im >= 0 { out += if c.im >= 0 {
'+$c.im' '+$c.im'
@ -40,7 +40,7 @@ pub fn (c Complex) mod() f64 {
// Complex Angle // Complex Angle
pub fn (c Complex) angle() f64 { pub fn (c Complex) angle() f64 {
return math.atan2(c.im, c.re) return math.atan2(c.im, c.re)
} }
@ -58,7 +58,7 @@ pub fn (c1 Complex) - (c2 Complex) Complex {
// Currently Not Supported // Currently Not Supported
// pub fn (c1 Complex) * (c2 Complex) Complex { // pub fn (c1 Complex) * (c2 Complex) Complex {
// return Complex{ // return Complex{
// (c1.re * c2.re) + ((c1.im * c2.im) * -1), // (c1.re * c2.re) + ((c1.im * c2.im) * -1),
// (c1.re * c2.im) + (c1.im * c2.re) // (c1.re * c2.im) + (c1.im * c2.re)
// } // }
// } // }
@ -67,8 +67,8 @@ pub fn (c1 Complex) - (c2 Complex) Complex {
// Currently Not Supported // Currently Not Supported
// pub fn (c1 Complex) / (c2 Complex) Complex { // pub fn (c1 Complex) / (c2 Complex) Complex {
// denom := (c2.re * c2.re) + (c2.im * c2.im) // denom := (c2.re * c2.re) + (c2.im * c2.im)
// return Complex { // return Complex {
// ((c1.re * c2.re) + ((c1.im * -c2.im) * -1))/denom, // ((c1.re * c2.re) + ((c1.im * -c2.im) * -1))/denom,
// ((c1.re * -c2.im) + (c1.im * c2.re))/denom // ((c1.re * -c2.im) + (c1.im * c2.re))/denom
// } // }
// } // }
@ -86,7 +86,7 @@ pub fn (c1 Complex) subtract(c2 Complex) Complex {
// Complex Multiplication c1.multiply(c2) // Complex Multiplication c1.multiply(c2)
pub fn (c1 Complex) multiply(c2 Complex) Complex { pub fn (c1 Complex) multiply(c2 Complex) Complex {
return Complex{ return Complex{
(c1.re * c2.re) + ((c1.im * c2.im) * -1), (c1.re * c2.re) + ((c1.im * c2.im) * -1),
(c1.re * c2.im) + (c1.im * c2.re) (c1.re * c2.im) + (c1.im * c2.re)
} }
} }
@ -94,8 +94,8 @@ pub fn (c1 Complex) multiply(c2 Complex) Complex {
// Complex Division c1.divide(c2) // Complex Division c1.divide(c2)
pub fn (c1 Complex) divide(c2 Complex) Complex { pub fn (c1 Complex) divide(c2 Complex) Complex {
denom := (c2.re * c2.re) + (c2.im * c2.im) denom := (c2.re * c2.re) + (c2.im * c2.im)
return Complex { return Complex {
((c1.re * c2.re) + ((c1.im * -c2.im) * -1)) / denom, ((c1.re * c2.re) + ((c1.im * -c2.im) * -1)) / denom,
((c1.re * -c2.im) + (c1.im * c2.re)) / denom ((c1.re * -c2.im) + (c1.im * c2.re)) / denom
} }
} }
@ -106,7 +106,7 @@ pub fn (c Complex) conjugate() Complex{
} }
// Complex Additive Inverse // Complex Additive Inverse
// Based on // Based on
// http://tutorial.math.lamar.edu/Extras/ComplexPrimer/Arithmetic.aspx // http://tutorial.math.lamar.edu/Extras/ComplexPrimer/Arithmetic.aspx
pub fn (c Complex) addinv() Complex { pub fn (c Complex) addinv() Complex {
return Complex{-c.re, -c.im} return Complex{-c.re, -c.im}
@ -121,7 +121,7 @@ pub fn (c Complex) mulinv() Complex {
-c.im / (c.re * c.re + c.im * c.im) -c.im / (c.re * c.re + c.im * c.im)
} }
} }
// Complex Power // Complex Power
// Based on // Based on
// https://www.khanacademy.org/math/precalculus/imaginary-and-complex-numbers/multiplying-and-dividing-complex-numbers-in-polar-form/a/complex-number-polar-form-review // https://www.khanacademy.org/math/precalculus/imaginary-and-complex-numbers/multiplying-and-dividing-complex-numbers-in-polar-form/a/complex-number-polar-form-review
@ -134,25 +134,25 @@ pub fn (c Complex) pow(n f64) Complex {
} }
} }
// Complex nth root // Complex nth root
pub fn (c Complex) root(n f64) Complex { pub fn (c Complex) root(n f64) Complex {
return c.pow(1.0 / n) return c.pow(1.0 / n)
} }
// Complex Exponential // Complex Exponential
// Using Euler's Identity // Using Euler's Identity
// Based on // Based on
// https://www.math.wisc.edu/~angenent/Free-Lecture-Notes/freecomplexnumbers.pdf // https://www.math.wisc.edu/~angenent/Free-Lecture-Notes/freecomplexnumbers.pdf
pub fn (c Complex) exp() Complex { pub fn (c Complex) exp() Complex {
a := math.exp(c.re) a := math.exp(c.re)
return Complex { return Complex {
a * math.cos(c.im), a * math.cos(c.im),
a * math.sin(c.im) a * math.sin(c.im)
} }
} }
// Complex Natural Logarithm // Complex Natural Logarithm
// Based on // Based on
// http://www.chemistrylearning.com/logarithm-of-complex-number/ // http://www.chemistrylearning.com/logarithm-of-complex-number/
pub fn (c Complex) ln() Complex { pub fn (c Complex) ln() Complex {
return Complex { return Complex {
@ -162,7 +162,7 @@ pub fn (c Complex) ln() Complex {
} }
// Complex Log Base Complex // Complex Log Base Complex
// Based on // Based on
// http://www.milefoot.com/math/complex/summaryops.htm // http://www.milefoot.com/math/complex/summaryops.htm
pub fn (c Complex) log(base Complex) Complex { pub fn (c Complex) log(base Complex) Complex {
return base.ln().divide(c.ln()) return base.ln().divide(c.ln())
@ -184,7 +184,7 @@ pub fn (c Complex) cpow(p Complex) Complex {
d := p.re * a + (1.0/2) * p.im * math.log(b) d := p.re * a + (1.0/2) * p.im * math.log(b)
t1 := math.pow(b,p.re/2) * math.exp(-p.im*a) t1 := math.pow(b,p.re/2) * math.exp(-p.im*a)
return Complex{ return Complex{
t1 * math.cos(d), t1 * math.cos(d),
t1 * math.sin(d) t1 * math.sin(d)
} }
} }
@ -238,7 +238,7 @@ pub fn (c Complex) csc() Complex {
} }
// Complex Arc Sin / Sin Inverse // Complex Arc Sin / Sin Inverse
// Based on // Based on
// http://www.milefoot.com/math/complex/summaryops.htm // http://www.milefoot.com/math/complex/summaryops.htm
pub fn (c Complex) asin() Complex { pub fn (c Complex) asin() Complex {
return complex(0,-1).multiply( return complex(0,-1).multiply(
@ -254,7 +254,7 @@ pub fn (c Complex) asin() Complex {
} }
// Complex Arc Consine / Consine Inverse // Complex Arc Consine / Consine Inverse
// Based on // Based on
// http://www.milefoot.com/math/complex/summaryops.htm // http://www.milefoot.com/math/complex/summaryops.htm
pub fn (c Complex) acos() Complex { pub fn (c Complex) acos() Complex {
return complex(0,-1).multiply( return complex(0,-1).multiply(
@ -271,7 +271,7 @@ pub fn (c Complex) acos() Complex {
} }
// Complex Arc Tangent / Tangent Inverse // Complex Arc Tangent / Tangent Inverse
// Based on // Based on
// http://www.milefoot.com/math/complex/summaryops.htm // http://www.milefoot.com/math/complex/summaryops.htm
pub fn (c Complex) atan() Complex { pub fn (c Complex) atan() Complex {
i := complex(0,1) i := complex(0,1)
@ -285,21 +285,21 @@ pub fn (c Complex) atan() Complex {
} }
// Complex Arc Cotangent / Cotangent Inverse // Complex Arc Cotangent / Cotangent Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse_Functions.htm // http://www.suitcaseofdreams.net/Inverse_Functions.htm
pub fn (c Complex) acot() Complex { pub fn (c Complex) acot() Complex {
return complex(1,0).divide(c).atan() return complex(1,0).divide(c).atan()
} }
// Complex Arc Secant / Secant Inverse // Complex Arc Secant / Secant Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse_Functions.htm // http://www.suitcaseofdreams.net/Inverse_Functions.htm
pub fn (c Complex) asec() Complex { pub fn (c Complex) asec() Complex {
return complex(1,0).divide(c).acos() return complex(1,0).divide(c).acos()
} }
// Complex Arc Cosecant / Cosecant Inverse // Complex Arc Cosecant / Cosecant Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse_Functions.htm // http://www.suitcaseofdreams.net/Inverse_Functions.htm
pub fn (c Complex) acsc() Complex { pub fn (c Complex) acsc() Complex {
return complex(1,0).divide(c).asin() return complex(1,0).divide(c).asin()
@ -354,7 +354,7 @@ pub fn (c Complex) csch() Complex {
} }
// Complex Hyperbolic Arc Sin / Sin Inverse // Complex Hyperbolic Arc Sin / Sin Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm // http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm
pub fn (c Complex) asinh() Complex { pub fn (c Complex) asinh() Complex {
return c.add( return c.add(
@ -365,7 +365,7 @@ pub fn (c Complex) asinh() Complex {
} }
// Complex Hyperbolic Arc Consine / Consine Inverse // Complex Hyperbolic Arc Consine / Consine Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm // http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm
pub fn (c Complex) acosh() Complex { pub fn (c Complex) acosh() Complex {
if(c.re > 1) { if(c.re > 1) {
@ -389,7 +389,7 @@ pub fn (c Complex) acosh() Complex {
} }
// Complex Hyperbolic Arc Tangent / Tangent Inverse // Complex Hyperbolic Arc Tangent / Tangent Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm // http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm
pub fn (c Complex) atanh() Complex { pub fn (c Complex) atanh() Complex {
one := complex(1,0) one := complex(1,0)
@ -419,7 +419,7 @@ pub fn (c Complex) atanh() Complex {
} }
// Complex Hyperbolic Arc Cotangent / Cotangent Inverse // Complex Hyperbolic Arc Cotangent / Cotangent Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm // http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm
pub fn (c Complex) acoth() Complex { pub fn (c Complex) acoth() Complex {
one := complex(1,0) one := complex(1,0)
@ -449,7 +449,7 @@ pub fn (c Complex) acoth() Complex {
} }
// Complex Hyperbolic Arc Secant / Secant Inverse // Complex Hyperbolic Arc Secant / Secant Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm // http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm
// For certain scenarios, Result mismatch in crossverification with Wolfram Alpha - analysis pending // For certain scenarios, Result mismatch in crossverification with Wolfram Alpha - analysis pending
// pub fn (c Complex) asech() Complex { // pub fn (c Complex) asech() Complex {
@ -457,7 +457,7 @@ pub fn (c Complex) acoth() Complex {
// if(c.re < -1.0) { // if(c.re < -1.0) {
// return one.subtract( // return one.subtract(
// one.subtract( // one.subtract(
// c.pow(2) // c.pow(2)
// ) // )
// .root(2) // .root(2)
// ) // )
@ -467,7 +467,7 @@ pub fn (c Complex) acoth() Complex {
// else { // else {
// return one.add( // return one.add(
// one.subtract( // one.subtract(
// c.pow(2) // c.pow(2)
// ) // )
// .root(2) // .root(2)
// ) // )
@ -477,14 +477,14 @@ pub fn (c Complex) acoth() Complex {
// } // }
// Complex Hyperbolic Arc Cosecant / Cosecant Inverse // Complex Hyperbolic Arc Cosecant / Cosecant Inverse
// Based on // Based on
// http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm // http://www.suitcaseofdreams.net/Inverse__Hyperbolic_Functions.htm
pub fn (c Complex) acsch() Complex { pub fn (c Complex) acsch() Complex {
one := complex(1,0) one := complex(1,0)
if(c.re < 0) { if(c.re < 0) {
return one.subtract( return one.subtract(
one.add( one.add(
c.pow(2) c.pow(2)
) )
.root(2) .root(2)
) )
@ -493,7 +493,7 @@ pub fn (c Complex) acsch() Complex {
} else { } else {
return one.add( return one.add(
one.add( one.add(
c.pow(2) c.pow(2)
) )
.root(2) .root(2)
) )

View File

@ -4,7 +4,7 @@
module math module math
const ( pub const (
e = 2.71828182845904523536028747135266249775724709369995957496696763 e = 2.71828182845904523536028747135266249775724709369995957496696763
pi = 3.14159265358979323846264338327950288419716939937510582097494459 pi = 3.14159265358979323846264338327950288419716939937510582097494459
phi = 1.61803398874989484820458683436563811772030917980576286213544862 phi = 1.61803398874989484820458683436563811772030917980576286213544862
@ -25,7 +25,7 @@ const (
// Floating-point limit values // Floating-point limit values
// max is the largest finite value representable by the type. // max is the largest finite value representable by the type.
// smallest_non_zero is the smallest positive, non-zero value representable by the type. // smallest_non_zero is the smallest positive, non-zero value representable by the type.
const ( pub const (
max_f32 = 3.40282346638528859811704183484516925440e+38 // 2**127 * (2**24 - 1) / 2**23 max_f32 = 3.40282346638528859811704183484516925440e+38 // 2**127 * (2**24 - 1) / 2**23
smallest_non_zero_f32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23) smallest_non_zero_f32 = 1.401298464324817070923729583289916131280e-45 // 1 / 2**(127 - 1 + 23)
@ -34,7 +34,7 @@ const (
) )
// Integer limit values // Integer limit values
const ( pub const (
max_i8 = 127 max_i8 = 127
min_i8 = -128 min_i8 = -128
max_i16 = 32767 max_i16 = 32767