⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mathfp.java

📁 J2me横版动作游戏源代码
💻 JAVA
字号:
/*
 * MathFP.java
 *
 * Created on 2006年6月25日, 下午6:19
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package tool;
public abstract class MathFP
{

    private static int _fbits = 12;
    private static int _one;
    private static int _fmask = 4095;
    private static int _flt = 0;
    private static int _pi;
    private static int e[];
    public static int PI;
    public static int E;
    public static final int MAX_VALUE = 0x7fffffff;
    public static final int MIN_VALUE = 0x80000001;

    public MathFP()
    {
    }
    public static int toInt(int i)
    {
        i = round(i, 0);
        return i >> _fbits;
    }

    public static int toFP(int i)
    {
        return i << _fbits;
    }

    public static int convert(int i, int j)
    {
        byte byte0 = i >= 0 ? ((byte) (1)) : -1;
        if(abs(j) < 13)
            if(_fbits < j)
                i = i + byte0 * (1 << (j - _fbits >> 1)) >> j - _fbits;
            else
                i <<= _fbits - j;
        return i;
    }
    public static int max(int i, int j)
    {
        return i >= j ? i : j;
    }

    public static int min(int i, int j)
    {
        return j >= i ? i : j;
    }

    public static int round(int i, int j)
    {
        int k = 10;
        for(int l = 0; l < j; l++)
            k *= 10;

        k = div(toFP(5), toFP(k));
        if(i < 0)
            k = -k;
        return i + k;
    }

    public static int mul(int i, int j)
    {
        boolean flag = false;
        int k = _fbits;
        int l = _fmask;
        if((i & l) == 0)
            return (i >> k) * j;
        if((j & l) == 0)
            return i * (j >> k);
        if(i < 0 && j > 0 || i > 0 && j < 0)
            flag = true;
        if(i < 0)
            i = -i;
        if(j < 0)
            j = -j;
        for(; max(i, j) >= 1 << 31 - k; k--)
        {
            i >>= 1;
            j >>= 1;
            l >>= 1;
        }

        int i1 = (i >> k) * (j >> k) << k;
        int j1 = (i & l) * (j & l) >> k;
        j1 += (i & ~l) * (j & l) >> k;
        i1 = i1 + j1 + ((i & l) * (j & ~l) >> k) << _fbits - k;
        if(i1 < 0)
            throw new ArithmeticException("Overflow");
        else
            return flag ? -i1 : i1;
    }

    public static int div(int i, int j)
    {
        boolean flag = false;
        int k = _fbits;
        if(j == _one)
            return i;
        if((j & _fmask) == 0)
            return i / (j >> k);
        if(i < 0 && j > 0 || i > 0 && j < 0)
            flag = true;
        if(i < 0)
            i = -i;
        if(j < 0)
            j = -j;
        for(; max(i, j) >= 1 << 31 - k; k--)
        {
            i >>= 1;
            j >>= 1;
        }

        int l = (i << k) / j << _fbits - k;
        return flag ? -l : l;
    }
    public static int abs(int i)
    {
        if(i < 0)
            return -i;
        else
            return i;
    }

    public static int sqrt(int i, int j)
    {
        if(i < 0)
            throw new ArithmeticException("Bad Input");
        if(i == 0)
            return 0;
        int k = i + _one >> 1;
        for(int l = 0; l < j; l++)
            k = k + div(i, k) >> 1;

        if(k < 0)
            throw new ArithmeticException("Overflow");
        else
            return k;
    }

    public static int sqrt(int i)
    {
        return sqrt(i, 16);
    }

    public static int sin(int i)
    {
        int j = mul(i, div(toFP(180), PI));
        j %= toFP(360);
        if(j < 0)
            j = toFP(360) + j;
        int k = j;
        if(j >= toFP(90) && j < toFP(270))
            k = toFP(180) - j;
        else
        if(j >= toFP(270) && j < toFP(360))
            k = -(toFP(360) - j);
        int l = k / 90;
        int i1 = mul(l, l);
        int j1 = mul(mul(mul(mul(-18 >> _flt, i1) + (326 >> _flt), i1) - (2646 >> _flt), i1) + (6434 >> _flt), l);
        return j1;
    }

    public static int asin(int i)
    {
        if(abs(i) > _one)
            throw new ArithmeticException("Bad Input");
        boolean flag = i < 0;
        if(i < 0)
            i = -i;
        int j = mul(mul(mul(mul(35 >> _flt, i) - (146 >> _flt), i) + (347 >> _flt), i) - (877 >> _flt), i) + (6434 >> _flt);
        int k = PI / 2 - mul(sqrt(_one - i), j);
        return flag ? -k : k;
    }

    public static int cos(int i)
    {
        return sin(PI / 2 - i);
    }

    public static int acos(int i)
    {
        return PI / 2 - asin(i);
    }

    public static int tan(int i)
    {
        return div(sin(i), cos(i));
    }

    public static int cot(int i)
    {
        return div(cos(i), sin(i));
    }
    public static int exp(int i)
    {
        if(i == 0)
            return _one;
        boolean flag = i < 0;
        i = abs(i);
        int j = i >> _fbits;
        int k = _one;
        for(int l = 0; l < j / 4; l++)
            k = mul(k, e[4] >> _flt);

        if(j % 4 > 0)
            k = mul(k, e[j % 4] >> _flt);
        i &= _fmask;
        if(i > 0)
        {
            int i1 = _one;
            int j1 = 0;
            int k1 = 1;
            for(int l1 = 0; l1 < 16; l1++)
            {
                j1 += i1 / k1;
                i1 = mul(i1, i);
                k1 *= l1 + 1;
                if(k1 > i1 || i1 <= 0 || k1 <= 0)
                    break;
            }

            k = mul(k, j1);
        }
        if(flag)
            k = div(_one, k);
        return k;
    }

    public static int log(int i)
    {
        if(i <= 0)
            throw new ArithmeticException("Bad Input");
        int j = 0;
        int l;
        for(l = 0; i >= _one << 1; l++)
            i >>= 1;

        int i1 = l * (2839 >> _flt);
        int j1 = 0;
        if(i < _one)
            return -log(div(_one, i));
        i -= _one;
        for(int k1 = 1; k1 < 20; k1++)
        {
            int k;
            if(j == 0)
                k = i;
            else
                k = mul(j, i);
            if(k == 0)
                break;
            j1 += ((k1 % 2 != 0 ? 1 : -1) * k) / k1;
            j = k;
        }

        return i1 + j1;
    }

    public static int pow(int i, int j)
    {
        boolean flag = j < 0;
        int k = _one;
        j = abs(j);
        for(int l = j >> _fbits; l-- > 0;)
            k = mul(k, i);

        if(k < 0)
            throw new ArithmeticException("Overflow");
        if(i != 0)
            k = mul(k, exp(mul(log(i), j & _fmask)));
        else
            k = 0;
        if(flag)
            return div(_one, k);
        else
            return k;
    }

    static 
    {
        _one = 4096;
        _pi = 12868;
        e = (new int[] {
            _one, 11134, 30266, 0x1415e, 0x36994
        });
        PI = _pi;
        E = e[1];
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -