快速业务通道

Java Math 类中的新功能,第 1 部分: 实数 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
    1.0

但是,随着角度的增加,误差开始变大,这种简单的方法就不是很适用了:

630.0000000000003    -1.0000001371557132    -1.0 652.5000000000005    -0.9238801080153761    -0.9238795325112841 675.0000000000005    -0.7071090807463408    -0.7071067811865422 697.5000000000006    -0.3826922100671368    - 0.3826834323650824

这里使用泰勒级数得到的结果实际上比我想像的要精确。但是,随着角度增加到 360 度 、720 度(4 pi 弧度)以及更大时,泰勒级数就逐渐需要更多条件来进行准确计算。 java.lang.Math 使用的更加完善的算法就避免了这一点。

泰勒级数的效率也无法与现代桌面芯片的内置正弦函数相比。要准确快速地计算正弦函数 和其他函数,需要非常仔细的算法,专门用于避免无意地将小的误差变成大的错误。这些算 法一般内置在硬件中以更快地执行。例如,几乎每个在最近 10 年内组装的 X86 芯片都具有 正弦和余弦函的硬件实现,X86 VM 只需调用即可,不用基于较原始的运算缓慢地计算它们。 HotSpot 利用这些指令显著加速了三角函数的运算。

直角三角形和欧几里德范数

每个高中学生都学过勾股定理:在直角三角形中,斜边边长的平方等于两条直角边边长平 方之和。即 c 2 = a 2 + b 2

学习过大学物理和高等数学的同学会发现,这个等式会在很多地方出现,不只是在直角三 角形中。例如,R 2 的平方、二维向量的长度、三角不等式等都存在勾股定理。(事实上, 这些只是看待同一件事情的不同方式。重点在于勾股定理比看上去要重要得多)。

Java 5 添加了 Math.hypot 函数来精确执行这种计算,这也是库很有用的一个出色的实 例证明。原始的简单方法如下:

public static double hypot(double x, double y){   return x*x + y*y; }

Java Math 类中的新功能,第 1 部分: 实数(3)

时间:2011-04-30 IBM Elliotte Rusty Harol

实际代码更复杂一些,如清单 2 所示。首先应注意的一点是,这是以本机 C 代码编写的 ,以使性能最大化。要注意的第二点是,它尽力使本计算中出现的错误最少。事实上,应根 据 x 和 y 的相对大小选择不同的算法。

清单 2. 实现 Math.hypot的实际代码/* * ==================================================== * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. * * Developed at SunSoft, a Sun Microsystems, Inc. business. * Permission to use, copy, modify, and distribute this * software is freely granted, provided that this notice * is preserved. * ==================================================== */ #include "fdlibm.h" #ifdef __STDC__     double __ieee754_hypot(double x, double y) #else     double __ieee754_hypot(x,y)     double x, y; #endif {     double a=x,b=y,t1,t2,y1,y2,w;     int j,k,ha,hb;     ha = __HI(x)&0x7fffffff;    /* high word of x */     hb = __HI(y)&0x7fffffff;    /* high word of y */     if(hb > ha) {a=y;b=x;j=ha; ha=hb;hb=j;} else {a=x;b=y;}     __HI(a) = ha;    /* a <- |a| */     __HI(b) = hb;    /* b <- |b| */     if((ha-hb)>0x3c00000) {return a+b;} /* x/y > 2**60 */     k=0;     if(ha > 0x5f300000) {    /* a>2**500 */       if(ha >= 0x7ff00000) {    /* Inf or NaN */         w = a+b;           /* for sNaN */         if(((ha&0xfffff)|__LO(a))==0) w = a;         if(

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号