Math与StrictMath

我们编写程序,经常使用到jdk的Math类,然而,Math里面许多数学函数方法是直接调用的StrictMath类里面的方法,而这些函数方法在StrictMath里面的形式是调用本地的非Java代码的接口,使用native关键字进行修饰

Math中的部分代码(从java.lang.Math类中提取的部分代码)

package java.lang;

import java.util.Random;

import sun.misc.FloatConsts;
import sun.misc.DoubleConsts;

public final class Math {

	/**
	 * Don't let anyone instantiate this class.
	 */
	private Math() {
	}

	public static final double E = 2.7182818284590452354;
	public static final double PI = 3.14159265358979323846;

	public static double sin(double a) {
		return StrictMath.sin(a); // default impl. delegates to StrictMath
	}

	public static double cos(double a) {
		return StrictMath.cos(a); // default impl. delegates to StrictMath
	}

	public static double tan(double a) {
		return StrictMath.tan(a); // default impl. delegates to StrictMath
	}

	public static double asin(double a) {
		return StrictMath.asin(a); // default impl. delegates to StrictMath
	}

	public static double acos(double a) {
		return StrictMath.acos(a); // default impl. delegates to StrictMath
	}

	public static double atan(double a) {
		return StrictMath.atan(a); // default impl. delegates to StrictMath
	}

	public static double exp(double a) {
		return StrictMath.exp(a); // default impl. delegates to StrictMath
	}

	public static double log(double a) {
		return StrictMath.log(a); // default impl. delegates to StrictMath
	}

	public static double log10(double a) {
		return StrictMath.log10(a); // default impl. delegates to StrictMath
	}

	public static double sqrt(double a) {
		return StrictMath.sqrt(a); // default impl. delegates to StrictMath
									// Note that hardware sqrt instructions
									// frequently can be directly used by JITs
									// and should be much faster than doing
									// Math.sqrt in software.
	}

	public static double cbrt(double a) {
		return StrictMath.cbrt(a);
	}

	public static double atan2(double y, double x) {
		return StrictMath.atan2(y, x); // default impl. delegates to StrictMath
	}

	public static double pow(double a, double b) {
		return StrictMath.pow(a, b); // default impl. delegates to StrictMath
	}

	public static double sinh(double x) {
		return StrictMath.sinh(x);
	}

	public static double cosh(double x) {
		return StrictMath.cosh(x);
	}

	public static double tanh(double x) {
		return StrictMath.tanh(x);
	}

	public static double hypot(double x, double y) {
		return StrictMath.hypot(x, y);
	}

	public static double expm1(double x) {
		return StrictMath.expm1(x);
	}

	public static double log1p(double x) {
		return StrictMath.log1p(x);
	}

}

StrictMath中的部分代码:

package java.lang;

import java.util.Random;
import sun.misc.DoubleConsts;

public final class StrictMath {

	/**
	 * Don't let anyone instantiate this class.
	 */
	private StrictMath() {
	}

	public static final double E = 2.7182818284590452354;

	public static final double PI = 3.14159265358979323846;

	public static native double sin(double a);

	public static native double cos(double a);

	public static native double tan(double a);

	public static native double asin(double a);

	public static native double acos(double a);

	public static native double atan(double a);

	public static native double exp(double a);

	public static native double log(double a);

	public static native double log10(double a);

	public static native double sqrt(double a);

	public static native double cbrt(double a);

	public static native double atan2(double y, double x);

	public static native double pow(double a, double b);

	public static native double sinh(double x);

	public static native double cosh(double x);

	public static native double tanh(double x);

	public static native double hypot(double x, double y);

	public static native double expm1(double x);

	public static native double log1p(double x);

}

根据上面的代码,可以看出,Math类的中的方法实现调用的StrictMath来实现,而在StrictMath类中方法用native修饰,表明调用的并非java代码,而是其它的,这里便是C代码来实现这些方法的,而这些源码在jdk中是没有公布的,根据注释可以获知这些

C的实现来之ftp://ftp.netlib.org/fdlibm.tar这里,但是却不能访问,于是百度netlib发现在http://www.netlib.org/liblist.html下的fdlibm中,使用C代码来实现这些基本的函数好处就是提高运行的效率

总结:

两个类的相同点:都是实现了基本的数学方法,都有互相调用的地方

不同点:两个类的所有相同方法中,Math类调用了StrictMath类的方法,而且都是用native修饰,C代码实现的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-30 10:08:54

Math与StrictMath的相关文章

K-means算法的java实现,聚类分析681个三国武将

分类: java 算法 2012-05-07 16:58 4988人阅读 评论(27) 收藏 举报 算法javastringdistancealignment 目录(?)[+] 一,k-means算法介绍: k-means算法接受输入量 k :然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的.k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之

Java——基础

1.数据类型 int,short,byte,long double,float char,String 2.变量 int var; var = 12; int var1 = 12;final int v1 = 0; //常量 C/C++变量的声明和定义是分开的,JAVA不区分. //c/c++ extern int a; //声明 int a = 0; //定义  3.运算符 JAVA的运算符.类型强制转化与C相似.  4.枚举 enum Size {SMALL,MIDIUM,LARGE}; 5

Java千百问_09基础类库(001)_lang包有什么功能

点击进入_更多_Java千百问-基础类库 1.lang包有什么功能 java.lang包是java语言的核心,它提供了java中的基础类.包括基本Object类.Class类.String类.基本类型的包装类.基本的数学类等等最基本的类.我们介绍一下Java 8中的java.lang包.主要类如下图:? 大体将java.lang包分为三类:类型.工具.系统,下面分别介绍其中比较常用的类: 类型 对象基类 Object,是java.lang的根类,也是所有类的超类. 类 Class,用来表示类和接

java.lang - 不用import

java.lang包是java语言的核心,它提供了java中的基础类.包括基本Object类.Class类.String类.基本类型的包装类.基本的数学类等等最基本的类.我们介绍一下Java 8中的java.lang包.主要类如下图: 类型 对象基类Object,是java.lang的根类,也是所有类的超类. 类Class,用来表示类和接口的类型.Class对象在类加载时由JVM调用类加载器中的defineClass方法自动构造.ClassLoader,负责加载类.Compiler,作为编译器的

Java.lang软件包中的类

Java.lang软件包是java语言的核心部分,它提供了java中的基础类.java.lang.Object,这是java.lang的根类,也是所有java类的超类.在构造java类的实例时,都先调用Object中的默认构造方法. 类java.lang.Class<T>也是一个非常重要的类.Class 类的实例用来表示正在运行的 Java 应用程序中的类和接口.Class对象在类加载时由JVM调用类加载器中的 defineClass 方法自动构造.java.lang.ClassLoader负

分支-04. 出租车计价(四舍五入)

本题要求根据某城市普通出租车收费标准编写程序进行车费计算.具体标准如下: 起步里程为3公里,起步费10元: 超起步里程后10公里内,每公里2元: 超过10公里以上的部分加收50%的回空补贴费,即每公里3元: 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费 ).  输入格式:输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔. 输出格式:在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元. 输入

Math.pow用法及实现探究

pow函数在java.lang.Math类中,是求次方的函数,定义为: public static double pow(double a, double b): 即求a的b次方,例如: public static void main(String[] args) { double a = 2.0D; double b = 4.0D; double r = Math.pow(a, b); System.out.println(r); //输出为16.0 } 查看源码,发现其实现调用了Strict

Java Math 类中的新功能--浮点数

Java™语言规范第 5 版向 java.lang.Math和 java.lang.StrictMath添加了 10 种新方法,Java 6 又添加了 10 种.这个共两部分的系列文章的 第 1 部分介绍了很有意义的新的数学方法.它提供了在还未出现计算机的时代中数学家比较熟悉的函数.在第 2 部分中,我主要关注这样一些函数,它们的目的是操作浮点数,而不是抽象实数. 就像我在 第 1 部分中提到的一样,实数(比如 e或 0.2)和它的计算机表示(比如 Java double)之间的区别是非常重要的

Math.round()

在 JAVA 中四舍五入采用 Math.round(T a) 函数,函数返回的是一个 long 类型的长整型,参数 a 可以是 double 也可以是 float. 查看 JDK 源码: public static long round(double a) { if (a != 0x1.fffffffffffffp-2) // greatest double value less than 0.5 return (long)floor(a + 0.5d); else return 0; } pu