【发布时间】:2020-11-23 18:27:28
【问题描述】:
如何在 kotlin 中访问双精度数的尾数和指数?
多平台选项是理想的,但 Double 类没有这样的方法/属性。
【问题讨论】:
-
除了在 JVM 上之外,我不知道有任何方法可以做到这一点,但使用
java.lang.Math和java.lang.Double.doubleToLongBits非常简单。
标签: kotlin floating-point double
如何在 kotlin 中访问双精度数的尾数和指数?
多平台选项是理想的,但 Double 类没有这样的方法/属性。
【问题讨论】:
java.lang.Math 和 java.lang.Double.doubleToLongBits 非常简单。
标签: kotlin floating-point double
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 规范对其进行转换。
【讨论】:
5.0 的尾数是1125899906842624。我该如何解释这个?
我可以建议所有编程语言通用的解决方案:
val mantissa = doubleValue - doubleValue.toInt()
【讨论】: