获取kotlin中double/float的尾数和指数
如何访问kotlin中双精度的尾数和指数获取kotlin中double/float的尾数和指数,kotlin,floating-point,double,Kotlin,Floating Point,Double,如何访问kotlin中双精度的尾数和指数 多平台选项是理想的,但Double类没有此类方法/属性。我可以建议所有编程语言的通用解决方案: val-mantissa=doubleValue-doubleValue.toInt()Kotlin提供了这个函数,它只是JDK的一个包装器。您可以从double-tolongbits的文档中看到: 位62-52(掩码0x7ff0000000000000L选择的位)表示指数。位51-0(掩码0x000fffffffffffffL选择的位)表示浮点数的有效位(有
多平台选项是理想的,但Double类没有此类方法/属性。我可以建议所有编程语言的通用解决方案:
val-mantissa=doubleValue-doubleValue.toInt()
Kotlin提供了这个函数,它只是JDK的一个包装器。您可以从double-tolongbits
的文档中看到:
位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规范进行转换。对不起,如果我不清楚,尾数指的是作为整数的有效数字,我不知道除了在JVM上之外还有什么方法可以做到这一点,但是
java.lang.Math
和java.lang.Double.doubleToLongBits
非常简单。这非常有用,但是我似乎无法正确解释它。如果我正确理解了规范,那么必须从指数中减去1023,但尾数对于大多数数字仍然不准确?例如,5.0
的尾数是1125899906842624
。我该怎么解释这件事?你也有把我送进兔子洞调查的危险。我现在没有时间进一步研究,但这是一个有趣的问题。如果你想进一步调查的话,下面是答案。