lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


This is my cin(x) version, by reducing |x| to below 0.1 radian.

If |x| >= 0.1, it's reduced value = (sin(0.1) to 0.1) ~ (0.099833, 0.1)
Taylor series last term is adjusted to reduce errors for this tight domain.

local abs, sin, asin = math.abs, math.sin, math.asin

function cin(x)
    local n = 0     -- count nested sin's
    while abs(x) >= 0.1 do x=sin(x); n=n+1 end
    local x2 = x*x
    x = x - x*x2*(1/18 + x2*(7/1080 + x2*(643/408240 + x2*0.0004635)))
    for i=1,n do x=asin(x) end
    return x
end

Result has about 13 digits accuracy:

x = 2.019
cin(x) = 1.02692 331869 35365
cin(cin(x)) = 0.95662 892999 61478
cin(cin(cin(x))) = 0.90122 698939 98782
math.sin(x)      = 0.90122 698939 98126