Java Math 类中的新功能,第 2 部分: 浮点数 - 编程入门网
。如果指数都是 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() 比一般的计算要准确一些:
如果要执行大量此类计算,Math.getExponent() 会更快。不过需要注意,它仅适用于计 算 2 的幂次方。例如,当改为 3 的幂次方时,结果如下:
getExponent() 不处理尾数,尾数由 Math.log() 处理。通过一些步骤,就可以找到尾数 、取尾数的对数并将该值添加到指数,但这有些费劲。如果想要快速估计数量级(而不是精 确值),Math.getExponent() 是非常有用的。 与 Math.log() 不同,Math.getExponent() 从不返回 NaN 或 Inf。如果参数为 NaN 或 Inf,则对应的浮点数和双精度数的结果分别是 128 和 1024。如果参数为 0,则对应的浮点 数和双精度数的结果分别是 -127 和 -1023。如果参数为负数,则数字的指数与该数字的绝 对值的指数相同。例如,-8 的指数为 3,这与 8 的指数相同。 没有对应的 getMantissa() 方法,但是使用简单的数学知识就能构造一个:
尽管算法不是很明显,但还是可以通过位屏蔽来查找尾数。要提取位,仅需计算 Double.doubleToLongBits(x) & 0x000FFFFFFFFFFFFFL。不过,随后则需要考虑正常数 字中多出的 1 位,然后再转换回范围在 1 到 2 之间的浮点数。 Java Math 类中的新功能,第 2 部分: 浮点数(3)时间:2011-04-30 IBM |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |