Answer

问题及解答

[DevPlan] 将十进制小数转为二进制

Posted by haifeng on 2023-02-12 20:16:07 last update 2023-02-12 20:36:55 | Edit | Answers (1)

现在考虑 $(0,1)$ 之间的有限小数.

对于形如 $\frac{1}{2^k}$ 的小数, 例如

\[0.5=\frac{1}{2},\quad 0.25=\frac{1}{2^2},\quad 0.125=\frac{1}{2^3},\quad 0.0625=\frac{1}{2^4},\quad\]

它们的二进制形式很简单, 分别为

\[0.5=(0.1)_2,\quad 0.25=(0.01)_2,\quad 0.125=(0.001)_2,\quad 0.0625=(0.0001)_2\]


这里打印 $\frac{1}{2^1}, \frac{1}{2^2}, \frac{1}{2^3}, \cdots, \frac{1}{2^{100}}$ 的小数形式.  

可以看到 $\frac{1}{2^n}$ 的小数形式在小数点之后有 $n$ 位数字.  $n$ 从 3 开始, 尾部以 125, 625 交替出现: 奇数为 125, 偶数为 625.

in> printSeries(1/2^n,n,1,100,\n)
0.5
0.25
0.125
0.0625
0.03125
0.015625
0.0078125
0.00390625
0.001953125
0.0009765625
0.00048828125
0.000244140625
0.0001220703125
0.00006103515625
0.000030517578125
0.0000152587890625
0.00000762939453125
0.000003814697265625
0.0000019073486328125
0.00000095367431640625
0.000000476837158203125
0.0000002384185791015625
0.00000011920928955078125
0.000000059604644775390625
0.0000000298023223876953125
0.00000001490116119384765625
0.000000007450580596923828125
0.0000000037252902984619140625
0.00000000186264514923095703125
0.000000000931322574615478515625
0.0000000004656612873077392578125
0.00000000023283064365386962890625
0.000000000116415321826934814453125
0.0000000000582076609134674072265625
0.00000000002910383045673370361328125
0.000000000014551915228366851806640625
0.0000000000072759576141834259033203125
0.00000000000363797880709171295166015625
0.000000000001818989403545856475830078125
0.0000000000009094947017729282379150390625
0.00000000000045474735088646411895751953125
0.000000000000227373675443232059478759765625
0.0000000000001136868377216160297393798828125
0.00000000000005684341886080801486968994140625
0.000000000000028421709430404007434844970703125
0.0000000000000142108547152020037174224853515625
0.00000000000000710542735760100185871124267578125
0.000000000000003552713678800500929355621337890625
0.0000000000000017763568394002504646778106689453125
0.00000000000000088817841970012523233890533447265625
0.000000000000000444089209850062616169452667236328125
0.0000000000000002220446049250313080847263336181640625
0.00000000000000011102230246251565404236316680908203125
0.000000000000000055511151231257827021181583404541015625
0.0000000000000000277555756156289135105907917022705078125
0.00000000000000001387778780781445675529539585113525390625
0.000000000000000006938893903907228377647697925567626953125
0.0000000000000000034694469519536141888238489627838134765625
0.00000000000000000173472347597680709441192448139190673828125
0.000000000000000000867361737988403547205962240695953369140625
0.0000000000000000004336808689942017736029811203479766845703125
0.00000000000000000021684043449710088680149056017398834228515625
0.000000000000000000108420217248550443400745280086994171142578125
0.0000000000000000000542101086242752217003726400434970855712890625
0.00000000000000000002710505431213761085018632002174854278564453125
0.000000000000000000013552527156068805425093160010874271392822265625
0.0000000000000000000067762635780344027125465800054371356964111328125
0.00000000000000000000338813178901720135627329000271856784820556640625
0.000000000000000000001694065894508600678136645001359283924102783203125
0.0000000000000000000008470329472543003390683225006796419620513916015625
0.00000000000000000000042351647362715016953416125033982098102569580078125
0.000000000000000000000211758236813575084767080625169910490512847900390625
0.0000000000000000000001058791184067875423835403125849552452564239501953125
0.00000000000000000000005293955920339377119177015629247762262821197509765625
0.000000000000000000000026469779601696885595885078146238811314105987548828125
0.0000000000000000000000132348898008484427979425390731194056570529937744140625
0.00000000000000000000000661744490042422139897126953655970282852649688720703125
0.000000000000000000000003308722450212110699485634768279851414263248443603515625
0.0000000000000000000000016543612251060553497428173841399257071316242218017578125
0.00000000000000000000000082718061255302767487140869206996285356581211090087890625
0.000000000000000000000000413590306276513837435704346034981426782906055450439453125
0.0000000000000000000000002067951531382569187178521730174907133914530277252197265625
0.00000000000000000000000010339757656912845935892608650874535669572651386260986328125
0.000000000000000000000000051698788284564229679463043254372678347863256931304931640625
0.0000000000000000000000000258493941422821148397315216271863391739316284656524658203125
0.00000000000000000000000001292469707114105741986576081359316958696581423282623291015625
0.000000000000000000000000006462348535570528709932880406796584793482907116413116455078125
0.0000000000000000000000000032311742677852643549664402033982923967414535582065582275390625
0.00000000000000000000000000161558713389263217748322010169914619837072677910327911376953125
0.000000000000000000000000000807793566946316088741610050849573099185363389551639556884765625
0.0000000000000000000000000004038967834731580443708050254247865495926816947758197784423828125
0.00000000000000000000000000020194839173657902218540251271239327479634084738790988922119140625
0.000000000000000000000000000100974195868289511092701256356196637398170423693954944610595703125
0.0000000000000000000000000000504870979341447555463506281780983186990852118469774723052978515625
0.00000000000000000000000000002524354896707237777317531408904915934954260592348873615264892578125
0.000000000000000000000000000012621774483536188886587657044524579674771302961744368076324462890625
0.0000000000000000000000000000063108872417680944432938285222622898373856514808721840381622314453125
0.00000000000000000000000000000315544362088404722164691426113114491869282574043609201908111572265625
0.000000000000000000000000000001577721810442023610823457130565572459346412870218046009540557861328125
0.0000000000000000000000000000007888609052210118054117285652827862296732064351090230047702789306640625


------------------------

 

1

Posted by haifeng on 2023-02-13 22:07:36

>> setprecision(20)
in> setprecision(20)
Now the precision is: 20

------------------------

>> decimal2binary(12.3)
in> decimal2binary(12.3)
0.3 - 0.25 = 0.05                                ==>  0.3 > 0.25=1/2^2, 所以在 0.[0][*]  * 处变为 1.
0.05 - 0.03125 = 0.01875                   ==>  0.3 > 0.03125=1/2^5, 所以在 0.[0][1][0][0][*]  * 处变为 1.
0.01875 - 0.015625 = 0.003125
0.003125 - 0.001953125 = 0.001171875
0.001171875 - 0.0009765625 = 0.0001953125
0.0001953125 - 0.0001220703125 = 0.0000732421875
0.0000732421875 - 0.00006103515625 = 0.00001220703125
0.00001220703125 - 0.00000762939453125 = 0.00000457763671875
0.00000457763671875 - 0.000003814697265625 = 0.000000762939453125
out> 11000.01001100110011001100

------------------------