2

以下是双精度值

-1.2316741412499997E8

以下是我正在使用的方法:

Long.toBinaryString(Double.doubleToRawLongBits(-1.2316741412499997E8))
output: 1100000110011101010111011000101011011000011111111111111111111110

但是,当我尝试使用值 2 执行此操作时,我得到以下输出,如下所示,这是错误的。

Long.toBinaryString(Double.doubleToRawLongBits(2.0))
output: 100000000000000000000000000000000000000000000000000000000000000

有人会告诉我如何将负双精度值转换为二进制。在此先感谢。

4

3 回答 3

5

我不确定你想要什么结果,但2.0 的结果是绝对正确的

请注意,它给出的数字不是零填充的,因此它似乎设置了符号位,但设置的位是指数的最高位。

于 2012-08-08T06:33:25.917 回答
4

浮点值(例如双精度)的表示方式与整数值完全不同。从整数值中,您习惯于将它们表示为零填充(对于正数)二进制数,该二进制数表示以 2 为底的相同数字。这不适用于浮点值。

根据定义,浮点值具有浮点小数点,因此二进制数必须对小数点所在位置的信息进行编码。这是通过将数字重塑为以下内容来完成的:

(+/-) x * 2^y   whereas 0 <= x < 2 (= 10 base 2)

(+/-)是需要一位的符号。x是尾数,y指数。所以二进制表示最后必须编码三个部分。

因为0 <= x < 2, x 总是以 1.something 开头,所以1.不需要在表示中。只有小数点后的部分被保存,它被认为是有效位。

在您的示例中, 2.0 被重塑为:

+ 1.0 * 2 ^ 1

符号:+ 有效数字:0 指数:1

这恰好表示为

0 10000000000 0000000000000000000000000000000000000000000000000000

对于负数,符号是 - 表示为前导1

1 10000000000 0000000000000000000000000000000000000000000000000000

请注意,您的原始帖子列出了一个缺少前导 0 的数字,这在数学上是正确的,但在您尝试捕获二进制表示时会产生误导:

  10000000000 0000000000000000000000000000000000000000000000000000 =
0 10000000000 0000000000000000000000000000000000000000000000000000

还有一些细节需要理解和记住。例如,指数也可以是负数。您可以在Floating Point Wikipedia 文章中找到更详细的解释。Joachim 引用的 binaryconvert.com 也可以帮助您理解表示。

于 2012-08-08T07:02:51.363 回答
0

这是你想要的吗?

System.out.println(Long.toBinaryString(Double.valueOf(2.0).longValue()));
System.out.println(Long.toBinaryString(Double.valueOf(-2.0).longValue()));
于 2012-08-08T06:36:45.680 回答