如何在浮点二进制中查看数字表示

时间:2016-10-05 08:51:00

标签: java c++ binary

例如,我的号码为0.1

double n = 0.1;

它以 IEEE-754 大端代表:

0 01111111011 1001100110011001100110011001100110011001100110011010

如何以这种二进制格式输出0.1

2 个答案:

答案 0 :(得分:5)

Float类可以为您调用方法Float.floatToIntBits

final int intBits = Float.floatToIntBits(4.1f);
final String binary = Integer.toBinaryString(intBits);
System.out.println(binary);

这里可以验证设置二进制结果的融合...

https://www.h-schmidt.net/FloatConverter/IEEE754.html

答案 1 :(得分:1)

要将双精度转换为二进制,您需要调用Double.doubleToLongBits(x)Long.toBinaryString(x)

所以你可以尝试String binary = Long.toBinaryString( Double.doubleToLongBits(0.1) );

要获得完整的64位表示,您必须根据需要预先添加0。

修改

既然你要了一个C版本,我会尝试添加一个(虽然我不是C专家所以我可能会错过像std lib函数这样的东西):

#include <stdio.h>
#include <stdint.h>

union binary {
    double d;
    uint64_t l;
} binary;

int main() {
    union binary b;
    b.d = 0.1; //set the value as double

    uint64_t bin = b.l; //read the value as 64-bit unsigned integer

    char c[65];
    c[64] = '\0'; //string terminator
    //iterate from 63 to 0
    for( int i = sizeof(uint64_t) * 8 - 1; i >= 0; i--) {
        if( bin & 1 ) {
            c[i]='1';
        } else {
            c[i]='0';
        }

        bin >>= 1; //right-shift by 1, i.e. 0010 -> 0001 etc.
    }                                                                                                                                             
    printf("%s\n",c);

    return 0;
}

这基本上使用了一个union结构,它允许你编写一个double并将字节作为64位无符号整数(也就是long long)访问。然后代码迭代该整数的副本,检查最后一位是否已设置并设置字符数组的相应元素,最后将位右移1。

注意,通过一些指针转换,你可以在没有union结构的情况下做同样的事情:double dbl = 0.1; uint64_t bin = *((uint64_t*)(&dbl));(你需要一个变量来指向某个东西,或者提供一个函数并获取一个指向参数的指针)。

最后一个警告:您必须确保您使用的数据类型具有相同的大小(即它们映射到完全相同的内存位置),否则您将遇到访问冲突或其他令人不快的东西