Java核心技术卷I基础知识3.5.1 数学函数与常量

3.5.1 数学函数与常量

在Math类中,包含了各种各样的数学函数。在编写不同类别的程序时,可能需要的函数也不同。

要想计算一个数值的平方根,可以使用sqrt方法:

 

      注释:println方法和sqrt方法存在微小的差异。println方法处理System.out对象。但是,Math类中的sqrt方法处理的不是对象,这样的方法被称为静态方法。有关静态方法的详细内容请参看第4章。

在Java中,没有幂运算,因此需要借助于Math类的pow方法。语句:

 

将y的值设置为x的a次幂(xa)。pow方法有两个double类型的参数,其返回结果也为double类型。

f?loorMod方法的目的是解决一个长期存在的有关整数余数的问题。考虑表达式n % 2。所有人都知道,如果n是偶数,这个表达式为0;如果n是奇数,表达式则为1。当然,除非n是负数。如果n为负,这个表达式则为-1。为什么呢?设计最早的计算机时,必须有人制定规则,明确整数除法和求余对负数操作数该如何处理。数学家们几百年来都知道这样一个最优(或“欧几里德”)规则:余数总是要≥0。不过,最早制定规则的人并没有翻开数学书好好研究,而是提出了一些看似合理但实际上很不方便的规则。

下面考虑这样一个问题:计算一个时钟时针的位置。这里要做一个时间调整,而且要归一化为一个0~11之间的数。这很简单:(position + adjustment) % 12。不过,如果这个调整为负会怎么样呢?你可能会得到一个负数。所以要引入一个分支,或者使用((position
+ adjustment) % 12 + 12) % 12。不管怎样,总之都很麻烦。

f?loorMod方法就让这个问题变得容易了:f?loorMod(position + adjustment,
12)总会得到一个0~11之间的数。(遗憾的是,对于负除数,f?loorMod会得到负数结果,不过这种情况在实际中很少出现。)

Math类提供了一些常用的三角函数:

 

还有指数函数以及它的反函数——自然对数以及以10为底的对数:

 

最后,Java还提供了两个用于表示π和e常量的近似值:

 

      提示:不必在数学方法名和常量名前添加前缀“Math”,只要在源文件的顶部加上下面这行代码就可以了。

 

例如:

 

在第4章中将讨论静态导入。

      注释:在Math类中,为了达到最快的性能,所有的方法都使用计算机浮点单元中的例程。如果得到一个完全可预测的结果比运行速度更重要的话,那么就应该使用StrictMath类。它使用“自由发布的Math库”(fdlibm)实现算法,以确保在所有平台上得到相同的结果。有关这些算法的源代码请参看www.netlib.org/fdlibm(当fdlibm为一个函数提供了多个定义时,StrictMath类就会遵循IEEE 754版本,它的名字将以“e”开头)。

时间: 2024-10-21 10:09:03

Java核心技术卷I基础知识3.5.1 数学函数与常量的相关文章

Java核心技术卷I基础知识1.5 关于Java的常见误解

1.5 关于Java的常见误解 在结束本章之前,我们列出了一些关于Java的常见误解,同时给出了解释. 1.?Java是HTML的扩展 Java是一种程序设计语言:HTML是一种描述网页结构的方式.除了用于在网页上放置Java applet的HTML扩展之外,两者没有任何共同之处. 2.?使用XML,所以不需要Java Java是一种程序设计语言:XML是一种描述数据的方式.可以使用任何一种程序设计语言处理XML数据,而Java API对XML处理提供了很好的支持.此外,许多重要的第三方XML工

Java核心技术卷I基础知识3.1 一个简单的Java应用程序

第3章 Java的基本程序设计结构 ▲  一个简单的Java应用程序     ▲  字符串 ▲  注释                      ▲  输入输出 ▲  数据类型               ▲  控制流 ▲  变量                      ▲  大数值 ▲  运算符                  ▲  数组   现在,假定已经成功地安装了JDK,并且能够运行第2章中给出的示例程序.我们从现在开始将介绍Java应用程序设计.本章主要介绍程序设计的基本概念(如数

Java核心技术卷I基础知识1.2.1 简单性

1.2.1 简单性 人们希望构建一个无须深奥的专业训练就可以进行编程的系统,并且要符合当今的标准惯例.因此,尽管人们发现C++不太适用,但在设计Java的时候还是尽可能地接近C++,以便系统更易于理解.Java剔除了C++中许多很少使用.难以理解.易混淆的特性.在目前看来,这些特性带来的麻烦远远多于其带来的好处. 的确,Java语法是C++语法的一个"纯净"版本.这里没有头文件.指针运算(甚至指针语法).结构.联合.操作符重载.虚基类等(请参阅本书各个章节给出的C++注释,其中比较详细

Java核心技术卷I基础知识3.7.2 格式化输出

3.7.2 格式化输出 可以使用System.out.print(x)将数值x输出到控制台上.这条命令将以x对应的数据类型所允许的最大非0数字位数打印输出x.例如:   打印   如果希望显示美元.美分等符号,则有可能会出现问题. 在早期的Java版本中,格式化数值曾引起过一些争议.庆幸的是,Java SE 5.0沿用了C语言库函数中的printf方法.例如,调用   可以用8个字符的宽度和小数点后两个字符的精度打印x.也就是说,打印输出一个空格和7个字符,如下所示:   在printf中,可以

Java核心技术卷I基础知识3.7.3 文件输入与输出

3.7.3 文件输入与输出 要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:   如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠: "c:\\mydirectory\\myf?ile.txt".       注释:在这里指定了UTF-8字符编码,这对于互联网上的文件很常见(不过并不是普遍适用).读取一个文本文件时,要知道它的字符编码--更多信息参见卷Ⅱ第2章.如果省略字符编码,则会使用运行这个Java程序的机器的"默

Java核心技术卷I基础知识3.8.5 多重选择:switch语句

3.8.5 多重选择:switch语句 在处理多个选项时,使用if/else结构显得有些笨拙.Java有一个与C/C++完全一样的switch语句. 例如,如果建立一个如图3-13所示的包含4个选项的菜单系统,可以使用下列代码:   switch语句将从与选项值相匹配的case标签处开始执行直到遇到break语句,或者执行到switch语句的结束处为止.如果没有相匹配的case标签,而有default子句,就执行这个子句.       警告:有可能触发多个case分支.如果在case分支语句的末

Java核心技术卷I基础知识3.6.6 码点与代码单元

3.6.6 码点与代码单元 Java字符串由char值序列组成.从3.3.3节"char类型"已经看到,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元.大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示. length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量.例如:   要想得到实际的长度,即码点数量,可以调用:   调用s.charAt(n)将返回位置n的代码单元,n介于0-s.length(

Java核心技术卷I基础知识3.3.2 浮点类型

3.3.2 浮点类型 浮点类型用于表示有小数部分的数值.在Java中有两种浮点类型,具体内容如表3-2所示. 表3-2 浮点类型 类型     存储需求     取值范围 f?loat    4字节   大约±3.402 823 47E+38F(有效位数为6-7位) double  8字节   大约±1.797 693 134 862 315 70E+308(有效位数为15位)   double表示这种类型的数值精度是f?loat类型的两倍(有人称之为双精度数值).绝大部分应用程序都采用doub

Java核心技术卷I基础知识2.5 构建并运行applet

2.5 构建并运行applet 本书给出的前两个程序是Java应用程序.它们与所有本地程序一样,是独立的程序.然而,正如第1章提到的,有关Java的大量宣传都在炫耀Java在浏览器中运行applet的能力.如果你对"过去的记忆"感兴趣,可以继续阅读下面的内容来了解如何构建和运行一个applet,以及如何在Web浏览器中显示:如果你不感兴趣,完全可以跳过这个例子,直接转到第3章. 首先,打开终端窗口并转到CoreJava/v1ch02/RoadApplet,然后,输入下面的命令:   图