#! perl -slw use strict; no warnings 'portable'; use Math::BigFloat; use Data::Dump qw[ pp ]; my @lookup = map{ Math::BigFloat->new( "$_" ) } ; # pp \@lookup; sub dd2dec { my( $hi, $lo ) = @_; my( $hiSign, $hiExp, $hiMant ) = unpack 'a1a11a52', unpack 'B64', reverse pack 'd', $hi; $hiExp = unpack 'v', pack 'b11', $hiExp; print $hiExp; my $loMant = unpack 'x12a52', unpack 'B64', reverse pack 'd', $lo; print $hiMant, ' ', $loMant; my $dec = $lookup[ 0 ]; substr( $hiMant, $_, 1 ) eq '1' and $dec += $lookup[ $_+1 ] for 0 .. 51; #$dec += $lookup[ 52 ]; #substr( $loMant, $_, 1 ) eq '1' and $dec += $lookup[ $_+51 ] for 0 .. 51; $dec += 4; return $dec->bstr; } sub FP2bin{ sprintf "%s %35.17e", join( ' ', unpack 'a1a11a52', unpack 'B64', reverse pack 'd', $_[0] ), $_[0]; } sub i2dd { my $bf = Math::BigFloat->new( shift ); my $hi = 0 + $bf->bstr; $bf -= Math::BigFloat->new( sprintf "%.17f", $hi ); my $lo = 0 + $bf->bstr; return ( $hi, $lo ); } sub d2Hex{ my $fp = shift; my $bin = unpack 'Q', pack 'd', $fp; my( $sign, $exp, $mant ) = ( ( ( $bin & 0x8000000000000000 ) ? '-' : '' ), ( ( ( $bin & 0x7FF0000000000000 ) >> 52 ) - 1023 ), ( $bin & 0x000FFFFFFFFFFFFF ) ); sprintf "%s0x1.%xp%d", $sign, $mant, $exp; } print join "\n", map{ FP2bin( $_ ) } i2dd( '3.1415926535897932384626433832795' ); print join "\n", map{ d2Hex( $_ ) } i2dd( '3.1415926535897932384626433832795' ); __DATA__ 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 0.00000000000000000000000000000039443045261050590270586428264139311483660321755451150238513946533203125 0.000000000000000000000000000000197215226305252951352932141320696557418301608777255751192569732666015625 0.0000000000000000000000000000000986076131526264756764660706603482787091508043886278755962848663330078125 0.00000000000000000000000000000004930380657631323783823303533017413935457540219431393779814243316650390625 0.000000000000000000000000000000024651903288156618919116517665087069677287701097156968899071216583251953125 0.0000000000000000000000000000000123259516440783094595582588325435348386438505485784844495356082916259765625 0.00000000000000000000000000000000616297582203915472977912941627176741932192527428924222476780414581298828125 0.000000000000000000000000000000003081487911019577364889564708135883709660962637144621112383902072906494140625 0.0000000000000000000000000000000015407439555097886824447823540679418548304813185723105561919510364532470703125 0.00000000000000000000000000000000077037197775489434122239117703397092741524065928615527809597551822662353515625 0.000000000000000000000000000000000385185988877447170611195588516985463707620329643077639047987759113311767578125 0.0000000000000000000000000000000001925929944387235853055977942584927318538101648215388195239938795566558837890625 0.00000000000000000000000000000000009629649721936179265279889712924636592690508241076940976199693977832794189453125 0.000000000000000000000000000000000048148248609680896326399448564623182963452541205384704880998469889163970947265625 0.0000000000000000000000000000000000240741243048404481631997242823115914817262706026923524404992349445819854736328125 0.00000000000000000000000000000000001203706215242022408159986214115579574086313530134617622024961747229099273681640625 0.000000000000000000000000000000000006018531076210112040799931070577897870431567650673088110124808736145496368408203125 0.0000000000000000000000000000000000030092655381050560203999655352889489352157838253365440550624043680727481842041015625 0.00000000000000000000000000000000000150463276905252801019998276764447446760789191266827202753120218403637409210205078125 0.000000000000000000000000000000000000752316384526264005099991383822237233803945956334136013765601092018187046051025390625 0.0000000000000000000000000000000000003761581922631320025499956919111186169019729781670680068828005460090935230255126953125 0.00000000000000000000000000000000000018807909613156600127499784595555930845098648908353400344140027300454676151275634765625 0.000000000000000000000000000000000000094039548065783000637498922977779654225493244541767001720700136502273380756378173828125 0.0000000000000000000000000000000000000470197740328915003187494614888898271127466222708835008603500682511366903781890869140625 0.00000000000000000000000000000000000002350988701644575015937473074444491355637331113544175043017503412556834518909454345703125 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625 0.0000000000000000000000000000000000000058774717541114375398436826861112283890933277838604376075437585313920862972736358642578125 #### C:\test>ddt 0 10000000000 1001001000011111101101010100010001000010110100011000 3.14159265358979310e+000 0 01111001010 0011111101000101111010110001010001101011101000110001 1.38462643383279500e-016 0x1.921fb54442d18p1 0x1.3f45eb146ba31p-53 3.1415926535897931000000000000000 0.0000000000000001384626433832795 3.1415926535897932384626433832795 Calculated 3.1415926535897932384626433832795 Input