加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

尾数和指数

(2013-11-17 10:24:46)
标签:

java学习

如何学习java

学习java哪里好

清软国际java学习

东方清软

教育

分类: JAVA学习

尾数和指数java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

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

java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

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));
       }
    }java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

    public static double lg(double x) {
        return Math.log(x)/Math.log(2);
    }
}java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

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

              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

java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

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

     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() 是非常有用的。java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

与 Math.log() 不同,Math.getExponent() 从不返回 NaN 或 Inf。如果参数为 NaN 或 Inf,则对应的浮点数和双精度数的结果分别是 128 和 1024。如果参数为 0,则对应的浮点数和双精度数的结果分别是 -127 和 -1023。如果参数为负数,则数字的指数与该数字的绝对值的指数相同。例如,-8 的指数为 3,这与 8 的指数相同。java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

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

    public static double getMantissa(double x) {
        int exponent = Math.getExponent(x);
        return x / Math.pow(2, exponent);
    }java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

尽管算法不是很明显,但还是可以通过位屏蔽来查找尾数。要提取位,仅需计算 Double.doubleToLongBits(x) & 0x000FFFFFFFFFFFFFL。不过,随后则需要考虑正常数字中多出的 1 位,然后再转换回范围在 1 到 2 之间的浮点数。java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

学习java哪里好?
学习java的视频:http://i.youku.com/u/UMTIwMTg2NjczMg 视频密码:sinojava

java学习 清软国际 软件工程师 如何学习java 学习java哪里好 东方清软java培训 清软国际java学习 计算机软件学习

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有