【问题标题】:Get mantissa and exponent of double/float in kotlin在kotlin中获取双精度/浮点数的尾数和指数
【发布时间】:2020-11-23 18:27:28
【问题描述】:

如何在 kotlin 中访问双精度数的尾数和指数?

多平台选项是理想的,但 Double 类没有这样的方法/属性。

【问题讨论】:

  • 除了在 JVM 上之外,我不知道有任何方法可以做到这一点,但使用 java.lang.Mathjava.lang.Double.doubleToLongBits 非常简单。

标签: kotlin floating-point double


【解决方案1】:

Kotlin 提供了 toBits() 函数,它只是 JDK 的 doubleToLongBits() 的包装器。你可以从doubleToLongBits的文档中看到:

位 62-52(由掩码 0x7ff0000000000000L 选择的位)表示指数。位 51-0(由掩码 0x000fffffffffffffL 选择的位)表示浮点数的有效位(有时称为尾数)。

因此您可以编写为您提取值的属性:

val Double.mantissa get() = toBits() and 0x000fffffffffffff
val Double.exponent get() = toBits() and 0x7ff0000000000000 shr 52

fun main() {
    println(1.0.mantissa)
    println(1.0.exponent)
}

输出:

0
1023

请注意,这些是原始的 IEEE-754 编码值。如果需要数值,则需要根据 IEEE-754 规范对其进行转换。

【讨论】:

  • 这很有帮助,但是我似乎无法正确解释它。如果我正确理解了规范,则必须从指数中减去 1023,但是对于大多数数字来说尾数仍然不准确?例如5.0 的尾数是1125899906842624。我该如何解释这个?
  • 你也有把我送进兔子洞调查这件事的危险。我现在没有时间进一步研究它,但这是一个有趣的问题。如果您想进一步调查,这里是specification
【解决方案2】:

我可以建议所有编程语言通用的解决方案:

val mantissa = doubleValue - doubleValue.toInt()

【讨论】:

  • 对不起,如果我不清楚,尾数是指有效数字作为整数
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 2018-02-23
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多