Skip to content

Commit

Permalink
Merge pull request #243 from pratikmota/mathfunc-part-8
Browse files Browse the repository at this point in the history
[Add Math function] Adding y0,y1,yn and j0,j1,jn math func
  • Loading branch information
refaktor authored Jul 1, 2024
2 parents 95be5e6 + 110186f commit 111a1b3
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 0 deletions.
112 changes: 112 additions & 0 deletions evaldo/builtins_math.go
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,118 @@ var Builtins_math = map[string]*env.Builtin{
}
},
},
"j0": {
Argsn: 1,
Doc: "Returns the order-zero Bessel function of the first kind.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch val := arg0.(type) {
case env.Integer:
return *env.NewDecimal(math.J0(float64(val.Value)))
case env.Decimal:
return *env.NewDecimal(math.J0(val.Value))
default:
return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j0")
}
},
},
"j1": {
Argsn: 1,
Doc: "Returns the order-one Bessel function of the first kind.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch val := arg0.(type) {
case env.Integer:
return *env.NewDecimal(math.J1(float64(val.Value)))
case env.Decimal:
return *env.NewDecimal(math.J1(val.Value))
default:
return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j1")
}
},
},
"y0": {
Argsn: 1,
Doc: "Returns the order-zero Bessel function of the second kind.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch val := arg0.(type) {
case env.Integer:
return *env.NewDecimal(math.Y0(float64(val.Value)))
case env.Decimal:
return *env.NewDecimal(math.Y0(val.Value))
default:
return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "Y0")
}
},
},
"y1": {
Argsn: 1,
Doc: "Returns the order-one Bessel function of the second kind.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch val := arg0.(type) {
case env.Integer:
return *env.NewDecimal(math.Y1(float64(val.Value)))
case env.Decimal:
return *env.NewDecimal(math.Y1(val.Value))
default:
return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "Y1")
}
},
},
"yn": {
Argsn: 2,
Doc: "Returns the order-n Bessel function of the second kind.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch v1 := arg0.(type) {
case env.Integer:
switch v2 := arg1.(type) {
case env.Integer:
return *env.NewDecimal(math.Yn(int(v1.Value), float64(v2.Value)))
case env.Decimal:
return *env.NewDecimal(math.Yn(int(v1.Value), v2.Value))
default:
return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn")
}
case env.Decimal:
switch v2 := arg1.(type) {
case env.Integer:
return *env.NewDecimal(math.Yn(int(v1.Value), float64(v2.Value)))
case env.Decimal:
return *env.NewDecimal(math.Yn(int(v1.Value), v2.Value))
default:
return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn")
}
default:
return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "yn")
}
},
},
"jn": {
Argsn: 2,
Doc: "Returns the order-n Bessel function of the first kind.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch v1 := arg0.(type) {
case env.Integer:
switch v2 := arg1.(type) {
case env.Integer:
return *env.NewDecimal(math.Jn(int(v1.Value), float64(v2.Value)))
case env.Decimal:
return *env.NewDecimal(math.Jn(int(v1.Value), v2.Value))
default:
return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn")
}
case env.Decimal:
switch v2 := arg1.(type) {
case env.Integer:
return *env.NewDecimal(math.Jn(int(v1.Value), float64(v2.Value)))
case env.Decimal:
return *env.NewDecimal(math.Jn(int(v1.Value), v2.Value))
default:
return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn")
}
default:
return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "jn")
}
},
},
"pi": {
Argsn: 0,
Doc: "Return Pi constant.",
Expand Down
36 changes: 36 additions & 0 deletions tests/misc.rye
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,42 @@ section "Math functions"
{
equal { do\in math { fma 2.0 4.0 6.0 } } 14.00
}
group "j0"
mold\nowrap ""
{ { string } }
{
equal { do\in math { j0 2.1 } } 0.16660698033199028
}
group "j1"
mold\nowrap ""
{ { string } }
{
equal { do\in math { j1 2.1 } } 0.5682921357570385
}
group "y0"
mold\nowrap ""
{ { string } }
{
equal { do\in math { y0 2.1 } } 0.5182937375137607
}
group "y1"
mold\nowrap ""
{ { string } }
{
equal { do\in math { y1 2.1 } } -0.051678612130423546
}
group "jn"
mold\nowrap ""
{ { string } }
{
equal { do\in math { jn 1 2.1 } } 0.5682921357570385
}
group "yn"
mold\nowrap ""
{ { string } }
{
equal { do\in math { yn 1 2.1 } } -0.051678612130423546
}

}

Expand Down

0 comments on commit 111a1b3

Please sign in to comment.