]> gitweb.factorcode.org Git - factor.git/commitdiff
ryu: add new vocab to convert double-precision floats to strings
authorAlexander Iljin <ajsoft@yandex.ru>
Mon, 31 Dec 2018 01:00:33 +0000 (02:00 +0100)
committerDoug Coleman <doug.coleman@gmail.com>
Mon, 31 Dec 2018 01:14:29 +0000 (19:14 -0600)
This commit corresponds to commit 5e1591c3cbee3c667e400d936e924c0d25d55aeb
in the original repo https://github.com/AlexIljin/ryu (minus README.md).

extra/ryu/authors.txt [new file with mode: 0644]
extra/ryu/data/data.factor [new file with mode: 0644]
extra/ryu/ryu-docs.factor [new file with mode: 0644]
extra/ryu/ryu-tests.factor [new file with mode: 0644]
extra/ryu/ryu.factor [new file with mode: 0644]
extra/ryu/summary.txt [new file with mode: 0644]

diff --git a/extra/ryu/authors.txt b/extra/ryu/authors.txt
new file mode 100644 (file)
index 0000000..8e1955f
--- /dev/null
@@ -0,0 +1 @@
+Alexander Ilin
diff --git a/extra/ryu/data/data.factor b/extra/ryu/data/data.factor
new file mode 100644 (file)
index 0000000..501c3d7
--- /dev/null
@@ -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
diff --git a/extra/ryu/ryu-docs.factor b/extra/ryu/ryu-docs.factor
new file mode 100644 (file)
index 0000000..bf08599
--- /dev/null
@@ -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 } "." } ;
diff --git a/extra/ryu/ryu-tests.factor b/extra/ryu/ryu-tests.factor
new file mode 100644 (file)
index 0000000..1531207
--- /dev/null
@@ -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
diff --git a/extra/ryu/ryu.factor b/extra/ryu/ryu.factor
new file mode 100644 (file)
index 0000000..c8ea3b1
--- /dev/null
@@ -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
diff --git a/extra/ryu/summary.txt b/extra/ryu/summary.txt
new file mode 100644 (file)
index 0000000..5d4e361
--- /dev/null
@@ -0,0 +1 @@
+Float to string conversion