ryu: add new vocab to convert double-precision floats to strings

This commit corresponds to commit 5e1591c3cbee3c667e400d936e924c0d25d55aeb
in the original repo https://github.com/AlexIljin/ryu (minus README.md).
freebsd-work
Alexander Iljin 2018-12-31 02:00:33 +01:00 committed by Doug Coleman
parent ffcb7839f6
commit 94af9254bd
6 changed files with 676 additions and 0 deletions

1
extra/ryu/authors.txt Normal file
View File

@ -0,0 +1 @@
Alexander Ilin

330
extra/ryu/data/data.factor Normal file
View File

@ -0,0 +1,330 @@
! Copyright (C) 2018 Alexander Ilin.
! See http://factorcode.org/license.txt for BSD license.
IN: ryu.data
CONSTANT: DIGIT_TABLE "00010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899"
CONSTANT: DOUBLE_POW5_INV_SPLIT {
{ 1 288230376151711744 } { 3689348814741910324 230584300921369395 }
{ 2951479051793528259 184467440737095516 } { 17118578500402463900 147573952589676412 }
{ 12632330341676300947 236118324143482260 } { 10105864273341040758 188894659314785808 }
{ 15463389048156653253 151115727451828646 } { 17362724847566824558 241785163922925834 }
{ 17579528692795369969 193428131138340667 } { 6684925324752475329 154742504910672534 }
{ 18074578149087781173 247588007857076054 } { 18149011334012135262 198070406285660843 }
{ 3451162622983977240 158456325028528675 } { 5521860196774363583 253530120045645880 }
{ 4417488157419490867 202824096036516704 } { 7223339340677503017 162259276829213363 }
{ 7867994130342094503 259614842926741381 } { 2605046489531765280 207691874341393105 }
{ 2084037191625412224 166153499473114484 } { 10713157136084480204 265845599156983174 }
{ 12259874523609494487 212676479325586539 } { 13497248433629505913 170141183460469231 }
{ 14216899864323388813 272225893536750770 } { 11373519891458711051 217780714829400616 }
{ 5409467098425058518 174224571863520493 } { 4965798542738183305 278759314981632789 }
{ 7661987648932456967 223007451985306231 } { 2440241304404055250 178405961588244985 }
{ 3904386087046488400 285449538541191976 } { 17880904128604832013 228359630832953580 }
{ 14304723302883865611 182687704666362864 } { 15133127457049002812 146150163733090291 }
{ 16834306301794583852 233840261972944466 } { 9778096226693756759 187072209578355573 }
{ 15201174610838826053 149657767662684458 } { 2185786488890659746 239452428260295134 }
{ 5437978005854438120 191561942608236107 } { 15418428848909281466 153249554086588885 }
{ 6222742084545298729 245199286538542217 } { 16046240111861969953 196159429230833773 }
{ 1768945645263844993 156927543384667019 } { 10209010661905972635 251084069415467230 }
{ 8167208529524778108 200867255532373784 } { 10223115638361732810 160693804425899027 }
{ 1599589762411131202 257110087081438444 } { 4969020624670815285 205688069665150755 }
{ 3975216499736652228 164550455732120604 } { 13739044029062464211 263280729171392966 }
{ 7301886408508061046 210624583337114373 } { 13220206756290269483 168499666669691498 }
{ 17462981995322520850 269599466671506397 } { 6591687966774196033 215679573337205118 }
{ 12652048002903177473 172543658669764094 } { 9175230360419352987 276069853871622551 }
{ 3650835473593572067 220855883097298041 } { 17678063637842498946 176684706477838432 }
{ 13527506561580357021 282695530364541492 } { 3443307619780464970 226156424291633194 }
{ 6443994910566282300 180925139433306555 } { 5155195928453025840 144740111546645244 }
{ 15627011115008661990 231584178474632390 } { 12501608892006929592 185267342779705912 }
{ 2622589484121723027 148213874223764730 } { 4196143174594756843 237142198758023568 }
{ 10735612169159626121 189713759006418854 } { 12277838550069611220 151771007205135083 }
{ 15955192865369467629 242833611528216133 } { 1696107848069843133 194266889222572907 }
{ 12424932722681605476 155413511378058325 } { 1433148282581017146 248661618204893321 }
{ 15903913885032455010 198929294563914656 } { 9033782293284053685 159143435651131725 }
{ 14454051669254485895 254629497041810760 } { 11563241335403588716 203703597633448608 }
{ 16629290697806691620 162962878106758886 } { 781423413297334329 260740604970814219 }
{ 4314487545379777786 208592483976651375 } { 3451590036303822229 166873987181321100 }
{ 5522544058086115566 266998379490113760 } { 4418035246468892453 213598703592091008 }
{ 10913125826658934609 170878962873672806 } { 10082303693170474728 273406340597876490 }
{ 8065842954536379782 218725072478301192 } { 17520720807854834795 174980057982640953 }
{ 5897060404116273733 279968092772225526 } { 1028299508551108663 223974474217780421 }
{ 15580034865808528224 179179579374224336 } { 17549358155809824511 286687326998758938 }
{ 2971440080422128639 229349861599007151 } { 17134547323305344204 183479889279205720 }
{ 13707637858644275364 146783911423364576 } { 14553522944347019935 234854258277383322 }
{ 4264120725993795302 187883406621906658 } { 10789994210278856888 150306725297525326 }
{ 9885293106962350374 240490760476040522 } { 529536856086059653 192392608380832418 }
{ 7802327114352668369 153914086704665934 } { 1415676938738538420 246262538727465495 }
{ 1132541550990830736 197010030981972396 } { 15663428499760305882 157608024785577916 }
{ 17682787970132668764 252172839656924666 } { 10456881561364224688 201738271725539733 }
{ 15744202878575200397 161390617380431786 } { 17812026976236499989 258224987808690858 }
{ 3181575136763469022 206579990246952687 } { 13613306553636506187 165263992197562149 }
{ 10713244041592678929 264422387516099439 } { 12259944048016053467 211537910012879551 }
{ 6118606423670932450 169230328010303641 } { 2411072648389671274 270768524816485826 }
{ 16686253377679378312 216614819853188660 } { 13349002702143502650 173291855882550928 }
{ 17669055508687693916 277266969412081485 } { 14135244406950155133 221813575529665188 }
{ 240149081334393137 177450860423732151 } { 11452284974360759988 283921376677971441 }
{ 5472479164746697667 227137101342377153 } { 11756680961281178780 181709681073901722 }
{ 2026647139541122378 145367744859121378 } { 18000030682233437097 232588391774594204 }
{ 18089373360528660001 186070713419675363 } { 3403452244197197031 148856570735740291 }
{ 16513570034941246220 238170513177184465 } { 13210856027952996976 190536410541747572 }
{ 3189987192878576934 152429128433398058 } { 1414630693863812771 243886605493436893 }
{ 8510402184574870864 195109284394749514 } { 10497670562401807014 156087427515799611 }
{ 9417575270359070576 249739884025279378 } { 14912757845771077107 199791907220223502 }
{ 4551508647133041040 159833525776178802 } { 10971762650154775986 255733641241886083 }
{ 16156107749607641435 204586912993508866 } { 9235537384944202825 163669530394807093 }
{ 11087511001168814197 261871248631691349 } { 12559357615676961681 209496998905353079 }
{ 13736834907283479668 167597599124282463 } { 18289587036911657145 268156158598851941 }
{ 10942320814787415393 214524926879081553 } { 16132554281313752961 171619941503265242 }
{ 11054691591134363444 274591906405224388 } { 16222450902391311402 219673525124179510 }
{ 12977960721913049122 175738820099343608 } { 17075388340318968271 281182112158949773 }
{ 2592264228029443648 224945689727159819 } { 5763160197165465241 179956551781727855 }
{ 9221056315464744386 287930482850764568 } { 14755542681855616155 230344386280611654 }
{ 15493782960226403247 184275509024489323 } { 1326979923955391628 147420407219591459 }
{ 9501865507812447252 235872651551346334 } { 11290841220991868125 188698121241077067 }
{ 1653975347309673853 150958496992861654 } { 10025058185179298811 241533595188578646 }
{ 4330697733401528726 193226876150862917 } { 14532604630946953951 154581500920690333 }
{ 1116074521063664381 247330401473104534 } { 4582208431592841828 197864321178483627 }
{ 14733813189500004432 158291456942786901 } { 16195403473716186445 253266331108459042 }
{ 5577625149489128510 202613064886767234 } { 8151448934333213131 162090451909413787 }
{ 16731667109675051333 259344723055062059 } { 17074682502481951390 207475778444049647 }
{ 6281048372501740465 165980622755239718 } { 6360328581260874421 265568996408383549 }
{ 8777611679750609860 212455197126706839 } { 10711438158542398211 169964157701365471 }
{ 9759603424184016492 271942652322184754 } { 11497031554089123517 217554121857747803 }
{ 16576322872755119460 174043297486198242 } { 11764721337440549842 278469275977917188 }
{ 16790474699436260520 222775420782333750 } { 13432379759549008416 178220336625867000 }
{ 3045063541568861850 285152538601387201 } { 17193446092222730773 228122030881109760 }
{ 13754756873778184618 182497624704887808 } { 18382503128506368341 145998099763910246 }
{ 3586563302416817083 233596959622256395 } { 2869250641933453667 186877567697805116 }
{ 17052795772514404226 149502054158244092 } { 12527077977055405469 239203286653190548 }
{ 17400360011128145022 191362629322552438 } { 2852241564676785048 153090103458041951 }
{ 15631632947708587046 244944165532867121 } { 8815957543424959314 195955332426293697 }
{ 18120812478965698421 156764265941034957 } { 14235904707377476180 250822825505655932 }
{ 4010026136418160298 200658260404524746 } { 17965416168102169531 160526608323619796 }
{ 2919224165770098987 256842573317791675 } { 2335379332616079190 205474058654233340 }
{ 1868303466092863352 164379246923386672 } { 6678634360490491686 263006795077418675 }
{ 5342907488392393349 210405436061934940 } { 4274325990713914679 168324348849547952 }
{ 10528270399884173809 269318958159276723 } { 15801313949391159694 215455166527421378 }
{ 1573004715287196786 172364133221937103 } { 17274202803427156150 275782613155099364 }
{ 17508711057483635243 220626090524079491 } { 10317620031244997871 176500872419263593 }
{ 12818843235250086271 282401395870821749 } { 13944423402941979340 225921116696657399 }
{ 14844887537095493795 180736893357325919 } { 15565258844418305359 144589514685860735 }
{ 6457670077359736959 231343223497377177 } { 16234182506113520537 185074578797901741 }
{ 9297997190148906106 148059663038321393 } { 11187446689496339446 236895460861314229 }
{ 12639306166338981880 189516368689051383 } { 17490142562555006151 151613094951241106 }
{ 2158786396894637579 242580951921985771 } { 16484424376483351356 194064761537588616 }
{ 9498190686444770762 155251809230070893 } { 11507756283569722895 248402894768113429 }
{ 12895553841597688639 198722315814490743 } { 17695140702761971558 158977852651592594 }
{ 17244178680193423523 254364564242548151 } { 10105994129412828495 203491651394038521 }
{ 4395446488788352473 162793321115230817 } { 10722063196803274280 260469313784369307 }
{ 1198952927958798777 208375451027495446 } { 15716557601334680315 166700360821996356 }
{ 17767794532651667857 266720577315194170 } { 14214235626121334286 213376461852155336 }
{ 7682039686155157106 170701169481724269 } { 1223217053622520399 273121871170758831 }
{ 15735968901865657612 218497496936607064 } { 16278123936234436413 174797997549285651 }
{ 219556594781725998 279676796078857043 } { 7554342905309201445 223741436863085634 }
{ 9732823138989271479 178993149490468507 } { 815121763415193074 286389039184749612 }
{ 11720143854957885429 229111231347799689 } { 13065463898708218666 183288985078239751 }
{ 6763022304224664610 146631188062591801 } { 3442138057275642729 234609900900146882 }
{ 13821756890046245153 187687920720117505 } { 11057405512036996122 150150336576094004 }
{ 6623802375033462826 240240538521750407 } { 16367088344252501231 192192430817400325 }
{ 13093670675402000985 153753944653920260 } { 2503129006933649959 246006311446272417 }
{ 13070549649772650937 196805049157017933 } { 17835137349301941396 157444039325614346 }
{ 2710778055689733971 251910462920982955 } { 2168622444551787177 201528370336786364 }
{ 5424246770383340065 161222696269429091 } { 1300097203129523457 257956314031086546 }
{ 15797473021471260058 206365051224869236 } { 8948629602435097724 165092040979895389 }
{ 3249760919670425388 264147265567832623 } { 9978506365220160957 211317812454266098 }
{ 15361502721659949412 169054249963412878 } { 2442311466204457120 270486799941460606 }
{ 16711244431931206989 216389439953168484 } { 17058344360286875914 173111551962534787 }
{ 12535955717491360170 276978483140055660 } { 10028764573993088136 221582786512044528 }
{ 15401709288678291155 177266229209635622 } { 9885339602917624555 283625966735416996 }
{ 4218922867592189321 226900773388333597 } { 14443184738299482427 181520618710666877 }
{ 4175850161155765295 145216494968533502 } { 10370709072591134795 232346391949653603 }
{ 15675264887556728482 185877113559722882 } { 5161514280561562140 148701690847778306 }
{ 879725219414678777 237922705356445290 } { 703780175531743021 190338164285156232 }
{ 11631070584651125387 152270531428124985 } { 162968861732249003 243632850284999977 }
{ 11198421533611530172 194906280227999981 } { 5269388412147313814 155925024182399985 }
{ 8431021459435702103 249480038691839976 } { 3055468352806651359 199584030953471981 }
{ 17201769941212962380 159667224762777584 } { 16454785461715008838 255467559620444135 }
{ 13163828369372007071 204374047696355308 } { 17909760324981426303 163499238157084246 }
{ 2830174816776909822 261598781051334795 } { 2264139853421527858 209279024841067836 }
{ 16568707141704863579 167423219872854268 } { 4373838538276319787 267877151796566830 }
{ 3499070830621055830 214301721437253464 } { 6488605479238754987 171441377149802771 }
{ 3003071137298187333 274306203439684434 } { 6091805724580460189 219444962751747547 }
{ 15941491023890099121 175555970201398037 } { 10748990379256517301 280889552322236860 }
{ 8599192303405213841 224711641857789488 } { 14258051472207991719 179769313486231590 }
}
CONSTANT: DOUBLE_POW5_SPLIT {
{ 0 72057594037927936 } { 0 90071992547409920 }
{ 0 112589990684262400 } { 0 140737488355328000 }
{ 0 87960930222080000 } { 0 109951162777600000 }
{ 0 137438953472000000 } { 0 85899345920000000 }
{ 0 107374182400000000 } { 0 134217728000000000 }
{ 0 83886080000000000 } { 0 104857600000000000 }
{ 0 131072000000000000 } { 0 81920000000000000 }
{ 0 102400000000000000 } { 0 128000000000000000 }
{ 0 80000000000000000 } { 0 100000000000000000 }
{ 0 125000000000000000 } { 0 78125000000000000 }
{ 0 97656250000000000 } { 0 122070312500000000 }
{ 0 76293945312500000 } { 0 95367431640625000 }
{ 0 119209289550781250 } { 4611686018427387904 74505805969238281 }
{ 10376293541461622784 93132257461547851 } { 8358680908399640576 116415321826934814 }
{ 612489549322387456 72759576141834259 } { 14600669991935148032 90949470177292823 }
{ 13639151471491547136 113686837721616029 } { 3213881284082270208 142108547152020037 }
{ 4314518811765112832 88817841970012523 } { 781462496279003136 111022302462515654 }
{ 10200200157203529728 138777878078144567 } { 13292654125893287936 86736173798840354 }
{ 7392445620511834112 108420217248550443 } { 4628871007212404736 135525271560688054 }
{ 16728102434789916672 84703294725430033 } { 7075069988205232128 105879118406787542 }
{ 18067209522111315968 132348898008484427 } { 8986162942105878528 82718061255302767 }
{ 6621017659204960256 103397576569128459 } { 3664586055578812416 129246970711410574 }
{ 16125424340018921472 80779356694631608 } { 1710036351314100224 100974195868289511 }
{ 15972603494424788992 126217744835361888 } { 9982877184015493120 78886090522101180 }
{ 12478596480019366400 98607613152626475 } { 10986559581596820096 123259516440783094 }
{ 2254913720070624656 77037197775489434 } { 12042014186943056628 96296497219361792 }
{ 15052517733678820785 120370621524202240 } { 9407823583549262990 75231638452626400 }
{ 11759779479436578738 94039548065783000 } { 14699724349295723422 117549435082228750 }
{ 4575641699882439235 73468396926392969 } { 10331238143280436948 91835496157991211 }
{ 8302361660673158281 114794370197489014 } { 1154580038986672043 143492962746861268 }
{ 9944984561221445835 89683101716788292 } { 12431230701526807293 112103877145985365 }
{ 1703980321626345405 140129846432481707 } { 17205888765512323542 87581154020301066 }
{ 12283988920035628619 109476442525376333 } { 1519928094762372062 136845553156720417 }
{ 12479170105294952299 85528470722950260 } { 15598962631618690374 106910588403687825 }
{ 5663645234241199255 133638235504609782 } { 17374836326682913246 83523897190381113 }
{ 7883487353071477846 104404871487976392 } { 9854359191339347308 130506089359970490 }
{ 10770660513014479971 81566305849981556 } { 13463325641268099964 101957882312476945 }
{ 2994098996302961243 127447352890596182 } { 15706369927971514489 79654595556622613 }
{ 5797904354682229399 99568244445778267 } { 2635694424925398845 124460305557222834 }
{ 6258995034005762182 77787690973264271 } { 3212057774079814824 97234613716580339 }
{ 17850130272881932242 121543267145725423 } { 18073860448192289507 75964541966078389 }
{ 8757267504958198172 94955677457597987 } { 6334898362770359811 118694596821997484 }
{ 13182683513586250689 74184123013748427 } { 11866668373555425458 92730153767185534 }
{ 5609963430089506015 115912692208981918 } { 17341285199088104971 72445432630613698 }
{ 12453234462005355406 90556790788267123 } { 10954857059079306353 113195988485333904 }
{ 13693571323849132942 141494985606667380 } { 17781854114260483896 88434366004167112 }
{ 3780573569116053255 110542957505208891 } { 114030942967678664 138178696881511114 }
{ 4682955357782187069 86361685550944446 } { 15077066234082509644 107952106938680557 }
{ 5011274737320973344 134940133673350697 } { 14661261756894078100 84337583545844185 }
{ 4491519140835433913 105421979432305232 } { 5614398926044292391 131777474290381540 }
{ 12732371365632458552 82360921431488462 } { 6692092170185797382 102951151789360578 }
{ 17588487249587022536 128688939736700722 } { 15604490549419276989 80430587335437951 }
{ 14893927168346708332 100538234169297439 } { 14005722942005997511 125672792711621799 }
{ 15671105866394830300 78545495444763624 } { 1142138259283986260 98181869305954531 }
{ 15262730879387146537 122727336632443163 } { 7233363790403272633 76704585395276977 }
{ 13653390756431478696 95880731744096221 } { 3231680390257184658 119850914680120277 }
{ 4325643253124434363 74906821675075173 } { 10018740084832930858 93633527093843966 }
{ 3300053069186387764 117041908867304958 } { 15897591223523656064 73151193042065598 }
{ 10648616992549794273 91438991302581998 } { 4087399203832467033 114298739128227498 }
{ 14332621041645359599 142873423910284372 } { 18181260187883125557 89295889943927732 }
{ 4279831161144355331 111619862429909666 } { 14573160988285219972 139524828037387082 }
{ 13719911636105650386 87203017523366926 } { 7926517508277287175 109003771904208658 }
{ 684774848491833161 136254714880260823 } { 7345513307948477581 85159196800163014 }
{ 18405263671790372785 106448996000203767 } { 18394893571310578077 133061245000254709 }
{ 13802651491282805250 83163278125159193 } { 3418256308821342851 103954097656448992 }
{ 4272820386026678563 129942622070561240 } { 2670512741266674102 81214138794100775 }
{ 17173198981865506339 101517673492625968 } { 3019754653622331308 126897091865782461 }
{ 4193189667727651020 79310682416114038 } { 14464859121514339583 99138353020142547 }
{ 13469387883465536574 123922941275178184 } { 8418367427165960359 77451838296986365 }
{ 15134645302384838353 96814797871232956 } { 471562554271496325 121018497339041196 }
{ 9518098633274461011 75636560836900747 } { 7285937273165688360 94545701046125934 }
{ 18330793628311886258 118182126307657417 } { 4539216990053847055 73863828942285886 }
{ 14897393274422084627 92329786177857357 } { 4786683537745442072 115412232722321697 }
{ 14520892257159371055 72132645451451060 } { 18151115321449213818 90165806814313825 }
{ 8853836096529353561 112707258517892282 } { 1843923083806916143 140884073147365353 }
{ 12681666973447792349 88052545717103345 } { 2017025661527576725 110065682146379182 }
{ 11744654113764246714 137582102682973977 } { 422879793461572340 85988814176858736 }
{ 528599741826965425 107486017721073420 } { 660749677283706782 134357522151341775 }
{ 7330497575943398595 83973451344588609 } { 13774807988356636147 104966814180735761 }
{ 3383451930163631472 131208517725919702 } { 15949715511634433382 82005323578699813 }
{ 6102086334260878016 102506654473374767 } { 3015921899398709616 128133318091718459 }
{ 18025852251620051174 80083323807324036 } { 4085571240815512351 100104154759155046 }
{ 14330336087874166247 125130193448943807 } { 15873989082562435760 78206370905589879 }
{ 15230800334775656796 97757963631987349 } { 5203442363187407284 122197454539984187 }
{ 946308467778435600 76373409087490117 } { 5794571603150432404 95466761359362646 }
{ 16466586540792816313 119333451699203307 } { 7985773578781816244 74583407312002067 }
{ 5370530955049882401 93229259140002584 } { 6713163693812353001 116536573925003230 }
{ 18030785363914884337 72835358703127018 } { 13315109668038829614 91044198378908773 }
{ 2808829029766373305 113805247973635967 } { 17346094342490130344 142256559967044958 }
{ 6229622945628943561 88910349979403099 } { 3175342663608791547 111137937474253874 }
{ 13192550366365765242 138922421842817342 } { 3633657960551215372 86826513651760839 }
{ 18377130505971182927 108533142064701048 } { 4524669058754427043 135666427580876311 }
{ 9745447189362598758 84791517238047694 } { 2958436949848472639 105989396547559618 }
{ 12921418224165366607 132486745684449522 } { 12687572408530742033 82804216052780951 }
{ 11247779492236039638 103505270065976189 } { 224666310012885835 129381587582470237 }
{ 2446259452971747599 80863492239043898 } { 12281196353069460307 101079365298804872 }
{ 15351495441336825384 126349206623506090 } { 14206370669262903769 78968254139691306 }
{ 8534591299723853903 98710317674614133 } { 15279925143082205283 123387897093267666 }
{ 14161639232853766206 77117435683292291 } { 13090363022639819853 96396794604115364 }
{ 16362953778299774816 120495993255144205 } { 12532689120651053212 75309995784465128 }
{ 15665861400813816515 94137494730581410 } { 10358954714162494836 117671868413226763 }
{ 4168503687137865320 73544917758266727 } { 598943590494943747 91931147197833409 }
{ 5360365506546067587 114913933997291761 } { 11312142901609972388 143642417496614701 }
{ 9375932322719926695 89776510935384188 } { 11719915403399908368 112220638669230235 }
{ 10038208235822497557 140275798336537794 } { 10885566165816448877 87672373960336121 }
{ 18218643725697949000 109590467450420151 } { 18161618638695048346 136988084313025189 }
{ 13656854658398099168 85617552695640743 } { 12459382304570236056 107021940869550929 }
{ 1739169825430631358 133777426086938662 } { 14922039196176308311 83610891304336663 }
{ 14040862976792997485 104513614130420829 } { 3716020665709083144 130642017663026037 }
{ 4628355925281870917 81651261039391273 } { 10397130925029726550 102064076299239091 }
{ 8384727637859770284 127580095374048864 } { 5240454773662356427 79737559608780540 }
{ 6550568467077945534 99671949510975675 } { 3576524565420044014 124589936888719594 }
{ 6847013871814915412 77868710555449746 } { 17782139376623420074 97335888194312182 }
{ 13004302183924499284 121669860242890228 } { 17351060901807587860 76043662651806392 }
{ 3242082053549933210 95054578314757991 } { 17887660622219580224 118818222893447488 }
{ 11179787888887237640 74261389308404680 } { 13974734861109047050 92826736635505850 }
{ 8245046539531533005 116033420794382313 } { 16682369133275677888 72520887996488945 }
{ 7017903361312433648 90651109995611182 } { 17995751238495317868 113313887494513977 }
{ 8659630992836983623 141642359368142472 } { 5412269370523114764 88526474605089045 }
{ 11377022731581281359 110658093256361306 } { 4997906377621825891 138322616570451633 }
{ 14652906532082110942 86451635356532270 } { 9092761128247862869 108064544195665338 }
{ 2142579373455052779 135080680244581673 } { 12868327154477877747 84425425152863545 }
{ 2250350887815183471 105531781441079432 } { 2812938609768979339 131914726801349290 }
{ 6369772649532999991 82446704250843306 } { 17185587848771025797 103058380313554132 }
{ 3035240737254230630 128822975391942666 } { 6508711479211282048 80514359619964166 }
{ 17359261385868878368 100642949524955207 } { 17087390713908710056 125803686906194009 }
{ 3762090168551861929 78627304316371256 } { 4702612710689827411 98284130395464070 }
{ 15101637925217060072 122855162994330087 } { 16356052730901744401 76784476871456304 }
{ 1998321839917628885 95980596089320381 } { 7109588318324424010 119975745111650476 }
{ 13666864735807540814 74984840694781547 } { 12471894901332038114 93731050868476934 }
{ 6366496589810271835 117163813585596168 } { 3979060368631419896 73227383490997605 }
{ 9585511479216662775 91534229363747006 } { 2758517312166052660 114417786704683758 }
{ 12671518677062341634 143022233380854697 } { 1002170145522881665 89388895863034186 }
{ 10476084718758377889 111736119828792732 } { 13095105898447972362 139670149785990915 }
{ 5878598177316288774 87293843616244322 } { 16571619758500136775 109117304520305402 }
{ 11491152661270395161 136396630650381753 } { 264441385652915120 85247894156488596 }
{ 330551732066143900 106559867695610745 } { 5024875683510067779 133199834619513431 }
{ 10058076329834874218 83249896637195894 } { 3349223375438816964 104062370796494868 }
{ 4186529219298521205 130077963495618585 } { 14145795808130045513 81298727184761615 }
{ 13070558741735168987 101623408980952019 } { 11726512408741573330 127029261226190024 }
{ 7329070255463483331 79393288266368765 } { 13773023837756742068 99241610332960956 }
{ 17216279797195927585 124052012916201195 } { 8454331864033760789 77532508072625747 }
{ 5956228811614813082 96915635090782184 } { 7445286014518516353 121144543863477730 }
{ 9264989777501460624 75715339914673581 } { 16192923240304213684 94644174893341976 }
{ 1794409976670715490 118305218616677471 } { 8039035263060279037 73940761635423419 }
{ 5437108060397960892 92425952044279274 } { 16019757112352226923 115532440055349092 }
{ 788976158365366019 72207775034593183 } { 14821278253238871236 90259718793241478 }
{ 9303225779693813237 112824648491551848 } { 11629032224617266546 141030810614439810 }
{ 11879831158813179495 88144256634024881 } { 1014730893234310657 110180320792531102 }
{ 10491785653397664129 137725400990663877 } { 8863209042587234033 86078375619164923 }
{ 6467325284806654637 107597969523956154 } { 17307528642863094104 134497461904945192 }
{ 10817205401789433815 84060913690590745 } { 18133192770664180173 105076142113238431 }
{ 18054804944902837312 131345177641548039 } { 18201782118205355176 82090736025967524 }
{ 4305483574047142354 102613420032459406 } { 14605226504413703751 128266775040574257 }
{ 2210737537617482988 80166734400358911 } { 16598479977304017447 100208418000448638 }
{ 11524727934775246001 125260522500560798 } { 2591268940807140847 78287826562850499 }
{ 17074144231291089770 97859783203563123 } { 16730994270686474309 122324729004453904 }
{ 10456871419179046443 76452955627783690 } { 3847717237119032246 95566194534729613 }
{ 9421332564826178211 119457743168412016 } { 5888332853016361382 74661089480257510 }
{ 16583788103125227536 93326361850321887 } { 16118049110479146516 116657952312902359 }
{ 16991309721690548428 72911220195563974 } { 12015765115258409727 91139025244454968 }
{ 15019706394073012159 113923781555568710 } { 9551260955736489391 142404726944460888 }
{ 5969538097335305869 89002954340288055 } { 2850236603241744433 111253692925360069 }
}
CONSTANT: DOUBLE_LOG10_2_DENOMINATOR 10000000
CONSTANT: DOUBLE_LOG10_2_NUMERATOR 3010299 ! DOUBLE_LOG10_2_DENOMINATOR * log_10(2)
CONSTANT: DOUBLE_LOG10_5_DENOMINATOR 10000000
CONSTANT: DOUBLE_LOG10_5_NUMERATOR 6989700 ! DOUBLE_LOG10_5_DENOMINATOR * log_10(5)
CONSTANT: DOUBLE_LOG2_5_DENOMINATOR 10000000
CONSTANT: DOUBLE_LOG2_5_NUMERATOR 23219280 ! DOUBLE_LOG2_5_DENOMINATOR * log_2(5)
CONSTANT: DOUBLE_POW5_INV_BITCOUNT 122
CONSTANT: DOUBLE_POW5_BITCOUNT 121

24
extra/ryu/ryu-docs.factor Normal file
View File

@ -0,0 +1,24 @@
! Copyright (C) 2018 Alexander Ilin.
! See http://factorcode.org/license.txt for BSD license.
USING: help.markup help.syntax kernel math strings ;
IN: ryu
ABOUT: "ryu"
ARTICLE: "ryu" "Ryū Float to String Conversion"
{ "The " { $vocab-link "ryu" } " vocab contains a Factor implementation of the Ryū algorithm to quickly convert floating point numbers to decimal strings. Only the double-precision floats (64-bit) are supported. Original author's reference implementation (C and Java) and additional information can be found here: " { $url "https://github.com/ulfjack/ryu" } "."
{ $subsections print-float d2s } } ;
HELP: print-float
{ $values
{ "value" number }
{ "string" string }
}
{ $description "Convert the " { $snippet "number" } " into its shortest stable floating-point representation string using the Ryū algorithm." } ;
HELP: d2s
{ $values
{ "value" number }
{ "string" string }
}
{ $description "An alias for " { $link print-float } "." } ;

View File

@ -0,0 +1,86 @@
! Copyright (C) 2018 Alexander Ilin.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel ryu math math.bitwise tools.test ;
IN: ryu.tests
! Basic
{ "0e0" } [ 0.0 d2s ] unit-test
{ "-0e0" } [ -0.0 d2s ] unit-test
{ "1e0" } [ 1.0 d2s ] unit-test
{ "-1e0" } [ -1.0 d2s ] unit-test
{ "NaN" } [ 0/0. d2s ] unit-test
{ "Inf" } [ 1/0. d2s ] unit-test
{ "-Inf" } [ -1/0. d2s ] unit-test
! SwitchToSubnormal
{ "2.2250738585072014e-308" } [ 2.2250738585072014e-308 d2s ] unit-test
! MinAndMax
{ "1.7976931348623157e308" } [ 0x7fefffffffffffff bits>double d2s ] unit-test
{ "5e-324" } [ 1 bits>double d2s ] unit-test
! LotsOfTrailingZeros
{ "2.9802322387695312e-8" } [ 2.98023223876953125e-8 d2s ] unit-test
! Regression
{ "-2.109808898695963e16" } [ -2.109808898695963e16 d2s ] unit-test
{ "4.940656e-318" } [ 4.940656e-318 d2s ] unit-test
{ "1.18575755e-316" } [ 1.18575755e-316 d2s ] unit-test
{ "2.989102097996e-312" } [ 2.989102097996e-312 d2s ] unit-test
{ "9.0608011534336e15" } [ 9.0608011534336e15 d2s ] unit-test
{ "4.708356024711512e18" } [ 4.708356024711512e18 d2s ] unit-test
{ "9.409340012568248e18" } [ 9.409340012568248e18 d2s ] unit-test
{ "1.2345678e0" } [ 1.2345678 d2s ] unit-test
! LooksLikePow5
! These numbers have a mantissa that is a multiple of the largest power of
! 5 that fits, and an exponent that causes the computation for q to result
! in 22, which is a corner case for Ryu.
{ "5.764607523034235e39" } [ 0x4830F0CF064DD592 bits>double d2s ] unit-test
{ "1.152921504606847e40" } [ 0x4840F0CF064DD592 bits>double d2s ] unit-test
{ "2.305843009213694e40" } [ 0x4850F0CF064DD592 bits>double d2s ] unit-test
! OutputLength
{ "1e0" } [ 1 d2s ] unit-test ! already tested in Basic
{ "1.2e0" } [ 1.2 d2s ] unit-test
{ "1.23e0" } [ 1.23 d2s ] unit-test
{ "1.234e0" } [ 1.234 d2s ] unit-test
{ "1.2345e0" } [ 1.2345 d2s ] unit-test
{ "1.23456e0" } [ 1.23456 d2s ] unit-test
{ "1.234567e0" } [ 1.234567 d2s ] unit-test
{ "1.2345678e0" } [ 1.2345678 d2s ] unit-test ! already tested in Regression
{ "1.23456789e0" } [ 1.23456789 d2s ] unit-test
{ "1.234567895e0" } [ 1.234567895 d2s ] unit-test ! 1.234567890 would be trimmed
{ "1.2345678901e0" } [ 1.2345678901 d2s ] unit-test
{ "1.23456789012e0" } [ 1.23456789012 d2s ] unit-test
{ "1.234567890123e0" } [ 1.234567890123 d2s ] unit-test
{ "1.2345678901234e0" } [ 1.2345678901234 d2s ] unit-test
{ "1.23456789012345e0" } [ 1.23456789012345 d2s ] unit-test
{ "1.234567890123456e0" } [ 1.234567890123456 d2s ] unit-test
{ "1.2345678901234567e0" } [ 1.2345678901234567 d2s ] unit-test
! Test 32-bit chunking
{ "4.294967294e0" } [ 4.294967294 d2s ] unit-test ! 2^32 - 2
{ "4.294967295e0" } [ 4.294967295 d2s ] unit-test ! 2^32 - 1
{ "4.294967296e0" } [ 4.294967296 d2s ] unit-test ! 2^32
{ "4.294967297e0" } [ 4.294967297 d2s ] unit-test ! 2^32 + 1
{ "4.294967298e0" } [ 4.294967298 d2s ] unit-test ! 2^32 + 2
! Test min, max shift values in shiftright128
! MinMaxShift
: make-double ( mantissa exponent neg? -- float )
[ 11 set-bit ] when 52 shift bitor bits>double ;
CONSTANT: maxMantissa 9007199254740991 ! (1 << 53) - 1;
{ "1.7800590868057611e-307" } [ 0 4 f make-double d2s ] unit-test
{ "2.8480945388892175e-306" } [ maxMantissa 6 f make-double d2s ] unit-test
{ "2.446494580089078e-296" } [ 0 41 f make-double d2s ] unit-test
{ "4.8929891601781557e-296" } [ maxMantissa 40 f make-double d2s ] unit-test
{ "1.8014398509481984e16" } [ 0 1077 f make-double d2s ] unit-test
{ "3.6028797018963964e16" } [ maxMantissa 1076 f make-double d2s ] unit-test
{ "2.900835519859558e-216" } [ 0 307 f make-double d2s ] unit-test
{ "5.801671039719115e-216" } [ maxMantissa 306 f make-double d2s ] unit-test
{ "3.196104012172126e-27" } [ 0x000FA7161A4D6e0C 934 f make-double d2s ] unit-test

234
extra/ryu/ryu.factor Normal file
View File

@ -0,0 +1,234 @@
! Copyright (C) 2018 Alexander Ilin.
! See http://factorcode.org/license.txt for BSD license.
USING: formatting kernel locals math math.bitwise math.functions
math.order ryu.data sequences shuffle strings vectors ;
IN: ryu
<PRIVATE
: mul-shift ( x mul shift -- y )
[ first2 rot [ * ] keep swapd * -64 shift + ] [ 64 - neg ] bi* shift ;
: mul-shift-all ( mmShift m mul shift -- vm vp vr )
[ 4 * ] 2dip
[ [ 1 - swap - ] 2dip mul-shift ]
[ [ 2 + ] 2dip mul-shift ]
[ mul-shift ] 3tri ;
:: pow-5-factor ( x -- y )
x :> value!
f 0 [ 2dup x <= swap not and ] [
value 5 /mod zero? [ value! 1 + ] [ nipd swap ] if
] while nip ; inline
: multiple-of-power-of-5 ( p value -- ? )
pow-5-factor <= ;
: double-pow-5-bits ( n -- m )
[ 1 ] [
DOUBLE_LOG2_5_NUMERATOR * DOUBLE_LOG2_5_DENOMINATOR + 1 -
DOUBLE_LOG2_5_DENOMINATOR /i
] if-zero ; inline
: decimal-length ( m -- n )
{
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
1000000000000000
10000000000000000
100000000000000000
1000000000000000000
} [ dupd >= ] find-last [ 2 + ] [ drop 1 ] if nip ; inline
CONSTANT: mantissaBits 52
CONSTANT: exponentBits 11
CONSTANT: offset 1023 ! (1 << (exponentBits - 1)) - 1
:: unpack-bits ( value -- e2 m2 acceptBounds ieeeExponent<=1? neg? string/f )
value double>bits
dup mantissaBits exponentBits + bit? :> sign
dup mantissaBits bits :> ieeeMantissa
mantissaBits neg shift exponentBits bits :> ieeeExponent
0 :> m2!
0 :> e2!
exponentBits on-bits ieeeExponent = [
ieeeMantissa zero? [ sign "-Inf" "Inf" ? ] [ "NaN" ] if
] [
ieeeExponent [
ieeeMantissa [ sign "-0e0" "0e0" ? ] [
m2!
-1 offset - mantissaBits - e2!
f
] if-zero
] [
offset - mantissaBits - 2 - e2!
ieeeMantissa mantissaBits set-bit m2!
f
] if-zero
] if [ e2 m2 dup even? ieeeExponent 1 <= sign ] dip ; inline
:: prepare-output ( vp! vplength acceptBounds vmIsTrailingZeros! vrIsTrailingZeros! vr! vm! -- vplength' output )
! vr is converted into the output
0 vplength
! the if has this stack-effect: ( lastRemovedDigit vplength -- lastRemovedDigit' vplength' output )
vmIsTrailingZeros vrIsTrailingZeros or [
! rare
[ vp 10 /i vm 10 /i 2dup > ] [
vm! vp!
vmIsTrailingZeros [ vm 10 divisor? vmIsTrailingZeros! ] when
vrIsTrailingZeros [ over zero? vrIsTrailingZeros! ] when
vr 10 /mod -roll vr! nip ! lastRemovedDigit!
1 - ! vplength!
] while 2drop
vmIsTrailingZeros [
[ vm dup 10 /i dup 10 * swapd = ] [
vm!
vrIsTrailingZeros [ over zero? vrIsTrailingZeros! ] when
vr 10 /mod -roll vr! nip ! lastRemovedDigit!
vp 10 /i vp!
1 - ! vplength!
] while drop ! Drop (vm 10 /i) result from the while condition.
] when
vrIsTrailingZeros [
over 5 = [
vr even? [ 4 -rot nip ] when ! 4 lastRemovedDigit!
] when
] when
vr pick 5 >= [ 1 + ] [
dup vm = [
acceptBounds vmIsTrailingZeros and not [ 1 + ] when
] when
] if
] [
! common
[ vp 10 /i vm 10 /i 2dup > ] [
vm! vp!
vr 10 /mod -roll vr! nip ! lastRemovedDigit!
1 - ! vplength!
] while 2drop
vr dup vm = [ 1 + ] [
pick 5 >= [ 1 + ] when
] if
] if nipd ; inline
: write-char ( index seq char -- index+1 seq' )
-rot [ tuck ] dip [ set-nth 1 + ] keep ; inline
: write-exp ( exp index result -- result' )
CHAR: e write-char
pick neg? [
CHAR: - write-char [ neg ] 2dip
] when
pick dup 100 >= [
100 /i CHAR: 0 + write-char
[ 100 mod 2 * ] 2dip
pick DIGIT_TABLE nth write-char
[ 1 + DIGIT_TABLE nth ] 2dip [ set-nth ] keep
] [
10 >= [
[ 2 * ] 2dip
pick DIGIT_TABLE nth write-char
[ 1 + DIGIT_TABLE nth ] 2dip [ set-nth ] keep
] [
[ CHAR: 0 + ] 2dip [ set-nth ] keep
] if
] if ; inline
:: produce-output ( exp sign olength output2! -- string )
25 <vector> 0 :> ( result i! )
0 sign [ CHAR: - swap result set-nth 1 ] when :> index!
[ output2 10000 >= ] [
output2 dup 10000 /i dup output2! 10000 * - :> c
index olength + i - 1 - :> res-index
c 100 mod 2 *
dup DIGIT_TABLE nth res-index result set-nth
1 + DIGIT_TABLE nth res-index 1 + result set-nth
c 100 /i 2 *
dup DIGIT_TABLE nth res-index 2 - result set-nth
1 + DIGIT_TABLE nth res-index 1 - result set-nth
i 4 + i!
] while
output2 100 >= [
output2 dup 100 /i dup output2! 100 * - 2 * :> c
index olength + i - :> res-index
c DIGIT_TABLE nth res-index 1 - result set-nth
c 1 + DIGIT_TABLE nth res-index result set-nth
i 2 + i!
] when
output2 10 >= [
output2 2 * :> c
index olength + i - :> res-index
c 1 + DIGIT_TABLE nth res-index result set-nth
c DIGIT_TABLE nth index result set-nth
] [ CHAR: 0 output2 + index result set-nth ] if
index 1 + index!
olength 1 > [
CHAR: . index result set-nth
index olength + index!
] when exp index result write-exp >string ; inline
PRIVATE>
:: print-float ( value -- string )
value >float unpack-bits [
[ 5drop ] dip
] [| e2 m2 acceptBounds ieeeExponent<=1 sign |
m2 4 * :> mv
mantissaBits 2^ m2 = not ieeeExponent<=1 or 1 0 ? :> mmShift
f f 0 0 0 :> ( vmIsTrailingZeros! vrIsTrailingZeros! e10! vr! vm! )
! After the following loop vp is left on stack.
e2 0 >= [
e2 DOUBLE_LOG10_2_NUMERATOR * DOUBLE_LOG10_2_DENOMINATOR /i 0 max :> q
q e10!
q double-pow-5-bits DOUBLE_POW5_INV_BITCOUNT + 1 - :> k
q k + e2 - :> i
mmShift m2 q DOUBLE_POW5_INV_SPLIT nth i mul-shift-all vr! swap vm! ! vp on stack
q 21 <= [
mv 5 divisor? [
q mv multiple-of-power-of-5 vrIsTrailingZeros!
] [
acceptBounds [
q mv mmShift - 1 - multiple-of-power-of-5 vmIsTrailingZeros!
] [
q mv 2 + multiple-of-power-of-5 1 0 ? - ! vp!
] if
] if
] when
] [ ! e2 < 0
e2 neg DOUBLE_LOG10_5_NUMERATOR * DOUBLE_LOG10_5_DENOMINATOR /i 1 - 0 max :> q
q e2 + e10!
e2 neg q - :> i
i double-pow-5-bits DOUBLE_POW5_BITCOUNT - :> k
q k - :> j
mmShift m2 i DOUBLE_POW5_SPLIT nth j mul-shift-all vr! swap vm! ! vp on stack
q 1 <= [
mv 1 bitand bitnot q >= vrIsTrailingZeros!
acceptBounds [
mv 1 - mmShift - bitnot 1 bitand q >= vmIsTrailingZeros!
] [ 1 - ] if ! vp!
] [
q 63 < [
q 1 - 2^ 1 - mv bitand zero? vrIsTrailingZeros!
] when
] if
] if
dup decimal-length ! vp vplength
dup e10 + 1 - sign 2swap ! exp and sign for produce-output
acceptBounds vmIsTrailingZeros vrIsTrailingZeros vr vm
prepare-output produce-output
] if* ;
ALIAS: d2s print-float

1
extra/ryu/summary.txt Normal file
View File

@ -0,0 +1 @@
Float to string conversion