3

0.(0011) や 0.0(101) のように繰り返される 2 進数が与えられた場合、それを 10 進数に変換するにはどうすればよいでしょうか?

これまで掘り下げてきたのは、以下のように、終端の 2 進数を 10 進数に変換する簡単な方法です。

res(N+2) = res(N+1) / 2 + res(N)

ここで、res はステップ N の後の結果であり、N は現在の反復です (N=0; n->(num 2 進数))。これを非終了の 2 進数に繰り返し適用すると、適切な近似値が得られます。たとえば、

dec:0.4 || bin: 0.(0110):

0     / 2 + 0 = 0
0     / 2 + 0 = 0
0     / 2 + 1 = 1
1/2   / 2 + 1 = 3/2
3/2   / 2 + 0 = 3/4
3/4   / 2 + 0 = 3/8
3/8   / 2 + 1 = 19/16
19/16 / 2 + 1 = 51/32
51/32 / 2 + 0 = 51/64
51/64 / 2 + 0 = 51/128 = 0.3984

これは約 0.4 です。

だから、私は概算を計算する手段を持っていますが、これを表現する方法を見つけるのに苦労しています. n->inf として限界で計算できるシリーズとしてそれを書き始めましたが、これまでのところあまり成功していません。

4

4 に答える 4

4

0.(0011) や 0.0(101) など、繰り返される 2 進数が与えられた場合、それを 10 進数に変換するにはどうすればよいでしょうか?

これは、10 進数とまったく同じように 2 進数でも解決できます (つまり、正確な有理数を決定できます)。10 進数では、たとえば、 が0.(567)あり、それが表す正確な有理数を決定したい場合は、単純に567分子として and 999( n 9snを含む数、 は繰り返しグループの桁数) を分母:

0.(567) = 567/999 = 189/333 = 63/111

これは現在最低の条件です。このプロセスは、 @Rick Regan によって言及された完全な無限幾何級数の結果を抽出したものです。

2 進数でも同じことを行いますが、n 9分母として s の代わりに s が必要ですn 1( 12 進数の最上位桁と同様)。たとえば

0.(0011) = 0011 / 1111 =(in decimal) 3/15 = 1/5

繰り返しグループの前に数字がある場合は、この計算の周りでいくつかの算術演算を行います。たとえば、は2 で割る0.0(101)だけです。0.(101)101 / 1115/70.0(101)5/14

于 2010-01-24T14:44:34.293 に答える
1

正確な答えを得る 1 つの方法は、無限幾何級数を使用することです。指数 1 から無限大 (0 <= r < 1) の分数 r のべき乗の無限和は、r/(1-r) です。

あなたの例では、0.(0011)、0.0011 は分数 3/16 を表します。3 を因数分解すると、r=1/16 が得られます。r/(1-r) = (1/16)/(15/16) = 1/15. これに因数分解した 3 を掛けると、答えが得られます: 3/15 = 1/5 = 0.2。

于 2010-01-24T14:23:48.873 に答える
0

コンピューターでさえ、それを完全に正しく理解することはできません。通常、値は単純に丸められます。精度が高すぎる float 値を表示し始めると、0.4 ではなく 0.3984 のような奇妙な値になってしまいます。

任意の基数の小数を別の基数に変換すると、多くの場合、精度が失われます。魔法のように回復することはできません。これが、お金のような重要なものを数えるプログラムで float や double を使用してはいけない主な理由です。

十分に正確であると考えるまで続けて、四捨五入してください。

于 2010-01-24T05:13:25.537 に答える
0

最大の桁 (10 進法では 9、2 進法では 1) を使用して 10 進数と同じことを行うと、1 つのステップですべてをまとめることができます。繰り返される数字の前。うまくいけば、例はこれを明確にします:

0.196(2) = (196*9 + 2)/(9000)
0.12(034) = (12*999 + 34)/99900

b0.01(011) = (b1*b111 + b11)/b11100 = (1*7 + 3)/(7*4) = 10/28
于 2019-01-17T01:38:24.143 に答える