Java Math 类中的新功能,第 1 部分:实数
2008-11-25 15:22
281 查看
在这篇由两部分组成的文章中,Elliotte Rusty Harold 与您一起探讨经典
有时候您会对一个类熟悉到忘记了它的存在。如果您能够写出
将帮助您自动完成所需的函数,您无需阅读它的 Javadoc。例如,我使用
这可能是我近五年来第一次读到,我发现这个类的大小几乎翻了一倍,包含 20 种我从来没听说过的新方法。看来我要对它另眼相看了。
Java™ 语言规范第 5 版向
种。在本文中,我重点讨论其中的比较单调的数学函数,如
部分,我将探讨专为操作浮点数(与抽象实数相反)而设计的函数。
抽象实数(如 π 或 0.2)与 Java
Java 表示法把数限制为固定位数。在处理非常大和非常小的数时,这点很重要。例如,2,000,000,001(二十亿零一)可以精确表示为一个
计算机算法(Java 语言和其他语言的算法)的第二个限制是它基于二进制而不是十进制。1/5 和 7/50 之类的分数可用十进制精确表示(分别是 0.2 和
0.14),但用二进制表示时,就会出现重复的分数。如同 1/3 在用十进制表示时,就会变为 0.3333333……以 10 为基数,任何分母仅包含质数因子 5
和 2 的分数都可以精确表示。以 2 为基数,则只有分母是 2 的乘方的分数才可以精确表示:1/2、1/4、1/8、1/16 等。
这种不精确性是迫切需要一个 math 类的最主要的原因之一。当然,您可以只使用标准的 + 和 *
运算符以及一个简单的循环来定义三角函数和其他使用泰勒级数展开式的函数,如清单 1 所示:
清单 1.
使用泰勒级数计算正弦
开始运行得不错,只有一点小的误差,如果存在误差的话,也只是最后一位小数不同:
本文转自IBM Developerworks中国
请点击此处查看全文
java.lang.Math类中的“新”功能。第 1 部分主要讨论比较单调的数学函数。第 2 部分将探讨专为操作浮点数而设计的函数。
有时候您会对一个类熟悉到忘记了它的存在。如果您能够写出
java.lang.Foo的文档,那么 Eclipse
将帮助您自动完成所需的函数,您无需阅读它的 Javadoc。例如,我使用
java.lang.Math(一个我自认为非常了解的类)时就是这样,但令我吃惊的是,我最近偶然读到它的 Javadoc ——
这可能是我近五年来第一次读到,我发现这个类的大小几乎翻了一倍,包含 20 种我从来没听说过的新方法。看来我要对它另眼相看了。
Java™ 语言规范第 5 版向
java.lang.Math(以及它的姊妹版
java.lang.StrictMath)添加了 10 种新方法,Java 6 又添加了 10
种。在本文中,我重点讨论其中的比较单调的数学函数,如
log10和
cosh。在第 2
部分,我将探讨专为操作浮点数(与抽象实数相反)而设计的函数。
抽象实数(如 π 或 0.2)与 Java
double之间的区别很明显。首先,数的理想状态是具有无限的精度,而
Java 表示法把数限制为固定位数。在处理非常大和非常小的数时,这点很重要。例如,2,000,000,001(二十亿零一)可以精确表示为一个
int,而不是一个
float。最接近的浮点数表示形式是 2.0E9 — 即两亿。使用
double数会更好,因为它们的位数更多(这是应该总是使用
double数而不是
float数的理由之一);但它们的精度仍然受到一定限制。
计算机算法(Java 语言和其他语言的算法)的第二个限制是它基于二进制而不是十进制。1/5 和 7/50 之类的分数可用十进制精确表示(分别是 0.2 和
0.14),但用二进制表示时,就会出现重复的分数。如同 1/3 在用十进制表示时,就会变为 0.3333333……以 10 为基数,任何分母仅包含质数因子 5
和 2 的分数都可以精确表示。以 2 为基数,则只有分母是 2 的乘方的分数才可以精确表示:1/2、1/4、1/8、1/16 等。
这种不精确性是迫切需要一个 math 类的最主要的原因之一。当然,您可以只使用标准的 + 和 *
运算符以及一个简单的循环来定义三角函数和其他使用泰勒级数展开式的函数,如清单 1 所示:
清单 1.
使用泰勒级数计算正弦
public class SineTaylor { public static void main(String[] args) { for (double angle = 0; angle <= 4*Math.PI; angle += Math.PI/8) { System.out.println(degrees(angle) + "/t" + taylorSeriesSine(angle) + "/t" + Math.sin(angle)); } } public static double degrees(double radians) { return 180 * radians/ Math.PI; } public static double taylorSeriesSine(double radians) { double sine = 0; int sign = 1; for (int i = 1; i < 40; i+=2) { sine += Math.pow(radians, i) * sign / factorial(i); sign *= -1; } return sine; } private static double factorial(int i) { double result = 1; for (int j = 2; j <= i; j++) { result *= j; } return result; } } |
本文转自IBM Developerworks中国
请点击此处查看全文
相关文章推荐
- Java Math 类中的新功能,第 1 部分: 实数
- Java Math 类中的新功能,第 1 部分: 实数
- Java Math 类中的新功能,第 1 部分: 实数
- Java Math 类中的新功能,第 1 部分: 实数
- 学霸网站部分功能测试
- 银行部分功能浅谈理解-to be continued
- 高级部分(百度地图四)实时定位功能的实现
- IE 8第二测试版发布 部分功能复制火狐3
- JavaScript学习笔记:用JavaScript部分小功能的实现
- Eclipse 中的 JFace 数据绑定,第 3 部分: 使用高级功能(2/19)
- Eclipse 中的 JFace 数据绑定,第 3 部分: 使用高级功能(14/19)
- 部分函数功能的实现
- 百度搜索下拉框效果(键盘操作)只完成部分功能,仅供参考
- List的All方法使用问题:我用List1的All方法来确保List1的所有每个数组元素中是否包含Arr1中的任意元素,这个部分很难实现。 因为,没有一个数组中是否包含另一个数组中的任意元素这个功能
- 使用实时 Java 进行开发,第 1 部分: 探索实时 Java 的独特功能
- javaSWing程序命令行和IDE运行没有问题,打包成jar后直接双击运行部分功能不行
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中大规模用户管理功能的改进部分
- Flex 屏蔽右键部分功能项
- 改进duilib的richedit控件的部分功能
- 基于 JFace Text Framework 构建全功能代码编辑器: 第 9 部分:Template