Java tutorial
/* * Float11.java * * Copyright (C) 2005-2008 Tommi Laukkanen * http://www.substanceofcode.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ //package com.substanceofcode.util; /** * <p> * Title: Class for float-point calculations in J2ME applications CLDC 1.1 * </p> * <p> * Description: Useful methods for float-point calculations which absent in * native Math class * </p> * <p> * Copyright: Copyright (c) 2004 Nick Henson * </p> * <p> * Company: UNTEH * </p> * <p> * License: Free use only for non-commercial purpose * </p> * <p> * If you want to use all or part of this class for commercial applications then * take into account these conditions: * </p> * <p> * 1. I need a one copy of your product which includes my class with license key * and so on * </p> * <p> * 2. Please append my copyright information henson.midp.Float (C) by Nikolay * Klimchuk on About screen of your product * </p> * <p> * 3. If you have web site please append link <a * href=http://henson.newmail.ru>Nikolay Klimchuk</a> on the page with * description of your product * </p> * <p> * That's all, thank you! * </p> * * @author Nikolay Klimchuk http://henson.newmail.ru * @version 0.51 */ public class Float11 { /** Square root from 3 */ final static public double SQRT3 = 1.732050807568877294; /** Log10 constant */ final static public double LOG10 = 2.302585092994045684; /** ln(0.5) constant */ final static public double LOGdiv2 = -0.6931471805599453094; // static public double acos(double x) { double f = asin(x); if (f == Double.NaN) return f; return Math.PI / 2 - f; } static public double asin(double x) { if (x < -1. || x > 1.) return Double.NaN; if (x == -1.) return -Math.PI / 2; if (x == 1) return Math.PI / 2; return atan(x / Math.sqrt(1 - x * x)); } static public double atan(double x) { boolean signChange = false; boolean Invert = false; int sp = 0; double x2, a; // check up the sign change if (x < 0.) { x = -x; signChange = true; } // check up the invertation if (x > 1.) { x = 1 / x; Invert = true; } // process shrinking the domain until x<PI/12 while (x > Math.PI / 12) { sp++; a = x + SQRT3; a = 1 / a; x = x * SQRT3; x = x - 1; x = x * a; } // calculation core x2 = x * x; a = x2 + 1.4087812; a = 0.55913709 / a; a = a + 0.60310579; a = a - (x2 * 0.05160454); a = a * x; // process until sp=0 while (sp > 0) { a = a + Math.PI / 6; sp--; } // invertation took place if (Invert) a = Math.PI / 2 - a; // sign change took place if (signChange) a = -a; // return a; } static public double atan2(double y, double x) { // if x=y=0 if (y == 0. && x == 0.) return 0.; // if x>0 atan(y/x) if (x > 0.) return atan(y / x); // if x<0 sign(y)*(pi - atan(|y/x|)) if (x < 0.) { if (y < 0.) return -(Math.PI - atan(y / x)); else return Math.PI - atan(-y / x); } // if x=0 y!=0 sign(y)*pi/2 if (y < 0.) return -Math.PI / 2.; else return Math.PI / 2.; } static public double exp(double x) { if (x == 0.) return 1.; // double f = 1; long d = 1; double k; boolean isless = (x < 0.); if (isless) x = -x; k = x / d; // for (long i = 2; i < 50; i++) { f = f + k; k = k * x / i; } // if (isless) return 1 / f; else return f; } static private double _log(double x) { if (!(x > 0.)) return Double.NaN; // double f = 0.0; // int appendix = 0; while (x > 0.0 && x <= 1.0) { x *= 2.0; appendix++; } // x /= 2.0; appendix--; // double y1 = x - 1.; double y2 = x + 1.; double y = y1 / y2; // double k = y; y2 = k * y; // for (long i = 1; i < 50; i += 2) { f += k / i; k *= y2; } // f *= 2.0; for (int i = 0; i < appendix; i++) f += LOGdiv2; // return f; } static public double log(double x) { if (!(x > 0.)) return Double.NaN; // if (x == 1.0) return 0.0; // Argument of _log must be (0; 1] if (x > 1.) { x = 1 / x; return -_log(x); } // return _log(x); } static public double log10(double x) { return log(x) / LOG10; } /* * static public double log10(double x) { if(!(x>0.)) return Double.NaN; // * boolean neg=false; if(x<0) { neg=true; x=-x; } // int index=0; if(x>1.) { * // Great 1 while(x>1.) { x=x/10; index++; } } else { // Less 1 * while(x<1.) { x=x*10.; index--; } } // double res=index; if(x!=1.) * res=res+(log(x)/LOG10); // if(neg) return 1./res; else return res; } */ static public double pow(double x, double y) { if (y == 0.) return 1.; if (y == 1.) return x; if (x == 0.) return 0.; if (x == 1.) return 1.; // long l = (long) Math.floor(y); boolean integerValue = (y == (double) l); // if (integerValue) { boolean neg = false; if (y < 0.) neg = true; // double result = x; for (long i = 1; i < (neg ? -l : l); i++) result = result * x; // if (neg) return 1. / result; else return result; } else { if (x > 0.) return exp(y * log(x)); else return Double.NaN; } } }