【问题标题】:How do you get the mantissa of a float in java?你如何在java中获得浮点数的尾数?
【发布时间】:2014-06-17 21:59:46
【问题描述】:

我正在尝试获取浮点数的尾数(只是为了学习),但它没有按预期工作。

说 5.3 的尾数是 53,对吗?我试过这段代码:

System.out.println(Float.floatToIntBits(5.3f) & 0x7FFFFF);

它打印了2726298。它不应该删除指数位并留下 53 吗?我尝试了很多东西,但这总是会发生。我在这里做错了什么?

【问题讨论】:

  • IEEE 浮点指数的底数是 2,而不是 10。
  • “说 5.3 的尾数是 53,对吧?”。错误的。它是二进制的,不是以 10 为底的
  • 你在考虑尾数是 decimal 点 - 它是一个 binary 点...
  • @user3580294 什么意思?
  • 5.3f 不是 5.3 x 10^1 浮点数。这是0b01010011001100110011010 x 2^10000001(不知道这些是否是确切的值,但我认为我所拥有的是正确的球场)

标签: java


【解决方案1】:

遵循IEEE标准的单精度公式为:

(-1)^sign + 1.Mantissa x 2^(Exponent - Bias)

所以5.3 base 10 是 101.0100110011001100110011 base 2

101.0100110011001100110011 = 1.010100110011001100110011 * 2^2

2^2 = 2^(exp - bias) 具有偏差 = 127(根据 IEEE 单精度标准)
所以:exp - 127 = 2 => exp = 129 base 10 或 10000001 base 2

单精度表:

0 | 10000001 | 01010011001100110011001

符号 = 0
经验 = 129
尾数 = 2726297

【讨论】:

  • 嗯...看来我解释错了。 Integer.toBinaryString(Float.floatToIntBits(5.3f)) 打印 1000000101010011001100110011010,看起来那里的指数不匹配......我哪里出错了?
  • 偏差是如何确定的?如果它是由 IEEE 定义的,并且 Java 符合 IEEE 标准,那不是问题吗?
  • @user3580294 偏差由 IEEE 标准确定,单精度(浮点)为 127,双精度为 1023
  • 啊,好的。这是有道理的。
  • @user3580294 是的,我不小心翻转了公式中Exp和Bias的位置
【解决方案2】:

从文章IBM: Java's new math. Floating-point numbers (in Russian) 获取尾数的最简单方法是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2018-07-19
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多