web-dev-qa-db-ja.com

浮動小数点数をバイナリに変換する方法は?

この浮動小数点数12.25をバイナリに変換する方法を教えてください。 「12」を変換する方法は知っていますが、0.25は変換しません

どんな助けも大歓迎です。ありがとう

33
Slim Black

10進数の後の数値に1.0になるまで2を掛け続けます。

0.25*2 = 0.50
0.50*2 = 1.00

結果は逆順で.01です。

24
Abhi

以下の例を検討してください

2.625をバイナリに変換します。

整数部と小数部を別々に検討します。

The integral part is easy, 2 = 10. 

小数部分の場合:

0.625   × 2 =   1.25    1   Generate 1 and continue with the rest.
0.25    × 2 =   0.5     0   Generate 0 and continue.
0.5     × 2 =   1.0     1   Generate 1 and nothing remains.

0.625 = 0.101、および2.625 = 10.101です。

詳細については、 this リンクを参照してください。

17
Govind Prabhu

(dは10進数、bは2進数を意味します)

  1. 12.25dはフロートです。
  2. 12dをバイナリで記述し、フロートから削除します。残り(.25d)のみが残ります。
  3. ドットを書きます。
  4. 剰余(0.25d)はゼロではありません(および/またはさらに桁数が必要です)に、2を乗算(-> 0.50d)し、ドット(0)の左側の桁を削除して書き込み、新しい剰余を続行します(.50d)。
13
comonad

Float値はIEEE 754形式で保存されるため、整数、char、バイナリのように直接変換することはできません。

しかし、ポインタを介してfloatをバイナリに変換できます。

#include <stdio.h>

int main()
{
    float a = 7.5;
    int i;
    int * p;

    p = &a;
    for (i = sizeof(int) * 8 - 1; i >= 0; i--)
    {   
        printf("%d", (*p) >> i & 1); 
    }   

    return 0;
}

出力

0 10000001 11100000000000000000000

明確化のために追加されたスペースは、プログラムの一部として含まれていません。

4
ilango victor
x = float(raw_input("enter number between 0 and 1: "))

p = 0
while ((2**p)*x) %1 != 0:
    p += 1
    # print p

    num = int (x * (2 ** p))
    # print num

    result = ''
    if num == 0:
        result = '0'
    while num > 0:
        result = str(num%2) + result
        num = num / 2

    for i in range (p - len(result)):
        result = '0' + result
    result = result[0:-p] + '.' + result[-p:]

print result #this will print result for the decimal portion
1
iLabQC