快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
。如果指数都是 0 位,则第 1 位为 0。否则第 1 位为 1。因为我们通常知道第 1 位是什么,所以没有必要包含在数字中。您 “免费” 得 到一个额外的位。是不是有些离奇?

尾数的第 1 位为 1 的浮点数是正常的。即尾数的值通常在 1 到 2 之间。尾数的第 1 位为 0 的浮点数是不正常的,尽管指数通常为 -125,但它通常能够表示更小的数字。

双精度数是以类似的方式编码的,但是它使用 52 位的尾数和 11 位的指数来获得更高的 精度。双精度数的指数的偏差是 1023。

Java Math 类中的新功能,第 2 部分: 浮点数(2)

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

尾数和指数

在 Java 6 中添加的两个 getExponent() 方法在表示浮点数或双精度数时返回无偏差 指 数。对于浮点数,这个数字的范围是 -125 到 +127,对于双精度数,这个数字的范围是 - 1022 到 +1023(Inf 和 NaN 为 +128/+1024)。例如,清单 1 根据更常见的以 2 为底数的 对数比较了 getExponent() 方法的结果:

清单 1. Math.log(x)/Math.log(2) 和 Math.getExponent()

public class ExponentTest {     public static void main(String[] args) {        System.out.println("x\tlg(x)\tMath.getExponent(x)");        for (int i = -255; i < 256; i++) {            double x = Math.pow(2, i);            System.out.println(                    x + "\t" +                    lg(x) + "\t" +                    Math.getExponent(x));        }     }     public static double lg(double x) {         return Math.log(x)/Math.log(2);     }  }

对于使用舍入的一些值,Math.getExponent() 比一般的计算要准确一些:

x       lg(x)       Math.getExponent(x) ... 2.68435456E8  28.0           28 5.36870912E8  29.000000000000004    29 1.073741824E9 30.0           30 2.147483648E9 31.000000000000004    31 4.294967296E9 32.0           32

如果要执行大量此类计算,Math.getExponent() 会更快。不过需要注意,它仅适用于计 算 2 的幂次方。例如,当改为 3 的幂次方时,结果如下:

x   lg(x)   Math.getExponent(x) ... 1.0  0.0         0 3.0  1.584962500721156 1 9.0  3.1699250014423126 3 27.0 4.754887502163469 4 81.0 6.339850002884625 6

getExponent() 不处理尾数,尾数由 Math.log() 处理。通过一些步骤,就可以找到尾数 、取尾数的对数并将该值添加到指数,但这有些费劲。如果想要快速估计数量级(而不是精 确值),Math.getExponent() 是非常有用的。

与 Math.log() 不同,Math.getExponent() 从不返回 NaN 或 Inf。如果参数为 NaN 或 Inf,则对应的浮点数和双精度数的结果分别是 128 和 1024。如果参数为 0,则对应的浮点 数和双精度数的结果分别是 -127 和 -1023。如果参数为负数,则数字的指数与该数字的绝 对值的指数相同。例如,-8 的指数为 3,这与 8 的指数相同。

没有对应的 getMantissa() 方法,但是使用简单的数学知识就能构造一个:

public static double getMantissa(double x) {      int exponent = Math.getExponent(x);      return x / Math.pow(2, exponent);    }

尽管算法不是很明显,但还是可以通过位屏蔽来查找尾数。要提取位,仅需计算 Double.doubleToLongBits(x) & 0x000FFFFFFFFFFFFFL。不过,随后则需要考虑正常数 字中多出的 1 位,然后再转换回范围在 1 到 2 之间的浮点数。

Java Math 类中的新功能,第 2 部分: 浮点数(3)

时间:2011-04-30 IBM

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号