PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /opt/golang/1.22.0/src/strconv
Viewing File: /opt/golang/1.22.0/src/strconv/ftoaryu.go
// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package strconv import ( "math/bits" ) // binary to decimal conversion using the Ryū algorithm. // // See Ulf Adams, "Ryū: Fast Float-to-String Conversion" (doi:10.1145/3192366.3192369) // // Fixed precision formatting is a variant of the original paper's // algorithm, where a single multiplication by 10^k is required, // sharing the same rounding guarantees. // ryuFtoaFixed32 formats mant*(2^exp) with prec decimal digits. func ryuFtoaFixed32(d *decimalSlice, mant uint32, exp int, prec int) { if prec < 0 { panic("ryuFtoaFixed32 called with negative prec") } if prec > 9 { panic("ryuFtoaFixed32 called with prec > 9") } // Zero input. if mant == 0 { d.nd, d.dp = 0, 0 return } // Renormalize to a 25-bit mantissa. e2 := exp if b := bits.Len32(mant); b < 25 { mant <<= uint(25 - b) e2 += b - 25 } // Choose an exponent such that rounded mant*(2^e2)*(10^q) has // at least prec decimal digits, i.e // mant*(2^e2)*(10^q) >= 10^(prec-1) // Because mant >= 2^24, it is enough to choose: // 2^(e2+24) >= 10^(-q+prec-1) // or q = -mulByLog2Log10(e2+24) + prec - 1 q := -mulByLog2Log10(e2+24) + prec - 1 // Now compute mant*(2^e2)*(10^q). // Is it an exact computation? // Only small positive powers of 10 are exact (5^28 has 66 bits). exact := q <= 27 && q >= 0 di, dexp2, d0 := mult64bitPow10(mant, e2, q) if dexp2 >= 0 { panic("not enough significant bits after mult64bitPow10") } // As a special case, computation might still be exact, if exponent // was negative and if it amounts to computing an exact division. // In that case, we ignore all lower bits. // Note that division by 10^11 cannot be exact as 5^11 has 26 bits. if q < 0 && q >= -10 && divisibleByPower5(uint64(mant), -q) { exact = true d0 = true } // Remove extra lower bits and keep rounding info. extra := uint(-dexp2) extraMask := uint32(1<<extra - 1) di, dfrac := di>>extra, di&extraMask roundUp := false if exact { // If we computed an exact product, d + 1/2 // should round to d+1 if 'd' is odd. roundUp = dfrac > 1<<(extra-1) || (dfrac == 1<<(extra-1) && !d0) || (dfrac == 1<<(extra-1) && d0 && di&1 == 1) } else { // otherwise, d+1/2 always rounds up because // we truncated below. roundUp = dfrac>>(extra-1) == 1 } if dfrac != 0 { d0 = false } // Proceed to the requested number of digits formatDecimal(d, uint64(di), !d0, roundUp, prec) // Adjust exponent d.dp -= q } // ryuFtoaFixed64 formats mant*(2^exp) with prec decimal digits. func ryuFtoaFixed64(d *decimalSlice, mant uint64, exp int, prec int) { if prec > 18 { panic("ryuFtoaFixed64 called with prec > 18") } // Zero input. if mant == 0 { d.nd, d.dp = 0, 0 return } // Renormalize to a 55-bit mantissa. e2 := exp if b := bits.Len64(mant); b < 55 { mant = mant << uint(55-b) e2 += b - 55 } // Choose an exponent such that rounded mant*(2^e2)*(10^q) has // at least prec decimal digits, i.e // mant*(2^e2)*(10^q) >= 10^(prec-1) // Because mant >= 2^54, it is enough to choose: // 2^(e2+54) >= 10^(-q+prec-1) // or q = -mulByLog2Log10(e2+54) + prec - 1 // // The minimal required exponent is -mulByLog2Log10(1025)+18 = -291 // The maximal required exponent is mulByLog2Log10(1074)+18 = 342 q := -mulByLog2Log10(e2+54) + prec - 1 // Now compute mant*(2^e2)*(10^q). // Is it an exact computation? // Only small positive powers of 10 are exact (5^55 has 128 bits). exact := q <= 55 && q >= 0 di, dexp2, d0 := mult128bitPow10(mant, e2, q) if dexp2 >= 0 { panic("not enough significant bits after mult128bitPow10") } // As a special case, computation might still be exact, if exponent // was negative and if it amounts to computing an exact division. // In that case, we ignore all lower bits. // Note that division by 10^23 cannot be exact as 5^23 has 54 bits. if q < 0 && q >= -22 && divisibleByPower5(mant, -q) { exact = true d0 = true } // Remove extra lower bits and keep rounding info. extra := uint(-dexp2) extraMask := uint64(1<<extra - 1) di, dfrac := di>>extra, di&extraMask roundUp := false if exact { // If we computed an exact product, d + 1/2 // should round to d+1 if 'd' is odd. roundUp = dfrac > 1<<(extra-1) || (dfrac == 1<<(extra-1) && !d0) || (dfrac == 1<<(extra-1) && d0 && di&1 == 1) } else { // otherwise, d+1/2 always rounds up because // we truncated below. roundUp = dfrac>>(extra-1) == 1 } if dfrac != 0 { d0 = false } // Proceed to the requested number of digits formatDecimal(d, di, !d0, roundUp, prec) // Adjust exponent d.dp -= q } var uint64pow10 = [...]uint64{ 1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, } // formatDecimal fills d with at most prec decimal digits // of mantissa m. The boolean trunc indicates whether m // is truncated compared to the original number being formatted. func formatDecimal(d *decimalSlice, m uint64, trunc bool, roundUp bool, prec int) { max := uint64pow10[prec] trimmed := 0 for m >= max { a, b := m/10, m%10 m = a trimmed++ if b > 5 { roundUp = true } else if b < 5 { roundUp = false } else { // b == 5 // round up if there are trailing digits, // or if the new value of m is odd (round-to-even convention) roundUp = trunc || m&1 == 1 } if b != 0 { trunc = true } } if roundUp { m++ } if m >= max { // Happens if di was originally 99999....xx m /= 10 trimmed++ } // render digits (similar to formatBits) n := uint(prec) d.nd = prec v := m for v >= 100 { var v1, v2 uint64 if v>>32 == 0 { v1, v2 = uint64(uint32(v)/100), uint64(uint32(v)%100) } else { v1, v2 = v/100, v%100 } n -= 2 d.d[n+1] = smallsString[2*v2+1] d.d[n+0] = smallsString[2*v2+0] v = v1 } if v > 0 { n-- d.d[n] = smallsString[2*v+1] } if v >= 10 { n-- d.d[n] = smallsString[2*v] } for d.d[d.nd-1] == '0' { d.nd-- trimmed++ } d.dp = d.nd + trimmed } // ryuFtoaShortest formats mant*2^exp with prec decimal digits. func ryuFtoaShortest(d *decimalSlice, mant uint64, exp int, flt *floatInfo) { if mant == 0 { d.nd, d.dp = 0, 0 return } // If input is an exact integer with fewer bits than the mantissa, // the previous and next integer are not admissible representations. if exp <= 0 && bits.TrailingZeros64(mant) >= -exp { mant >>= uint(-exp) ryuDigits(d, mant, mant, mant, true, false) return } ml, mc, mu, e2 := computeBounds(mant, exp, flt) if e2 == 0 { ryuDigits(d, ml, mc, mu, true, false) return } // Find 10^q *larger* than 2^-e2 q := mulByLog2Log10(-e2) + 1 // We are going to multiply by 10^q using 128-bit arithmetic. // The exponent is the same for all 3 numbers. var dl, dc, du uint64 var dl0, dc0, du0 bool if flt == &float32info { var dl32, dc32, du32 uint32 dl32, _, dl0 = mult64bitPow10(uint32(ml), e2, q) dc32, _, dc0 = mult64bitPow10(uint32(mc), e2, q) du32, e2, du0 = mult64bitPow10(uint32(mu), e2, q) dl, dc, du = uint64(dl32), uint64(dc32), uint64(du32) } else { dl, _, dl0 = mult128bitPow10(ml, e2, q) dc, _, dc0 = mult128bitPow10(mc, e2, q) du, e2, du0 = mult128bitPow10(mu, e2, q) } if e2 >= 0 { panic("not enough significant bits after mult128bitPow10") } // Is it an exact computation? if q > 55 { // Large positive powers of ten are not exact dl0, dc0, du0 = false, false, false } if q < 0 && q >= -24 { // Division by a power of ten may be exact. // (note that 5^25 is a 59-bit number so division by 5^25 is never exact). if divisibleByPower5(ml, -q) { dl0 = true } if divisibleByPower5(mc, -q) { dc0 = true } if divisibleByPower5(mu, -q) { du0 = true } } // Express the results (dl, dc, du)*2^e2 as integers. // Extra bits must be removed and rounding hints computed. extra := uint(-e2) extraMask := uint64(1<<extra - 1) // Now compute the floored, integral base 10 mantissas. dl, fracl := dl>>extra, dl&extraMask dc, fracc := dc>>extra, dc&extraMask du, fracu := du>>extra, du&extraMask // Is it allowed to use 'du' as a result? // It is always allowed when it is truncated, but also // if it is exact and the original binary mantissa is even // When disallowed, we can subtract 1. uok := !du0 || fracu > 0 if du0 && fracu == 0 { uok = mant&1 == 0 } if !uok { du-- } // Is 'dc' the correctly rounded base 10 mantissa? // The correct rounding might be dc+1 cup := false // don't round up. if dc0 { // If we computed an exact product, the half integer // should round to next (even) integer if 'dc' is odd. cup = fracc > 1<<(extra-1) || (fracc == 1<<(extra-1) && dc&1 == 1) } else { // otherwise, the result is a lower truncation of the ideal // result. cup = fracc>>(extra-1) == 1 } // Is 'dl' an allowed representation? // Only if it is an exact value, and if the original binary mantissa // was even. lok := dl0 && fracl == 0 && (mant&1 == 0) if !lok { dl++ } // We need to remember whether the trimmed digits of 'dc' are zero. c0 := dc0 && fracc == 0 // render digits ryuDigits(d, dl, dc, du, c0, cup) d.dp -= q } // mulByLog2Log10 returns math.Floor(x * log(2)/log(10)) for an integer x in // the range -1600 <= x && x <= +1600. // // The range restriction lets us work in faster integer arithmetic instead of // slower floating point arithmetic. Correctness is verified by unit tests. func mulByLog2Log10(x int) int { // log(2)/log(10) ≈ 0.30102999566 ≈ 78913 / 2^18 return (x * 78913) >> 18 } // mulByLog10Log2 returns math.Floor(x * log(10)/log(2)) for an integer x in // the range -500 <= x && x <= +500. // // The range restriction lets us work in faster integer arithmetic instead of // slower floating point arithmetic. Correctness is verified by unit tests. func mulByLog10Log2(x int) int { // log(10)/log(2) ≈ 3.32192809489 ≈ 108853 / 2^15 return (x * 108853) >> 15 } // computeBounds returns a floating-point vector (l, c, u)×2^e2 // where the mantissas are 55-bit (or 26-bit) integers, describing the interval // represented by the input float64 or float32. func computeBounds(mant uint64, exp int, flt *floatInfo) (lower, central, upper uint64, e2 int) { if mant != 1<<flt.mantbits || exp == flt.bias+1-int(flt.mantbits) { // regular case (or denormals) lower, central, upper = 2*mant-1, 2*mant, 2*mant+1 e2 = exp - 1 return } else { // border of an exponent lower, central, upper = 4*mant-1, 4*mant, 4*mant+2 e2 = exp - 2 return } } func ryuDigits(d *decimalSlice, lower, central, upper uint64, c0, cup bool) { lhi, llo := divmod1e9(lower) chi, clo := divmod1e9(central) uhi, ulo := divmod1e9(upper) if uhi == 0 { // only low digits (for denormals) ryuDigits32(d, llo, clo, ulo, c0, cup, 8) } else if lhi < uhi { // truncate 9 digits at once. if llo != 0 { lhi++ } c0 = c0 && clo == 0 cup = (clo > 5e8) || (clo == 5e8 && cup) ryuDigits32(d, lhi, chi, uhi, c0, cup, 8) d.dp += 9 } else { d.nd = 0 // emit high part n := uint(9) for v := chi; v > 0; { v1, v2 := v/10, v%10 v = v1 n-- d.d[n] = byte(v2 + '0') } d.d = d.d[n:] d.nd = int(9 - n) // emit low part ryuDigits32(d, llo, clo, ulo, c0, cup, d.nd+8) } // trim trailing zeros for d.nd > 0 && d.d[d.nd-1] == '0' { d.nd-- } // trim initial zeros for d.nd > 0 && d.d[0] == '0' { d.nd-- d.dp-- d.d = d.d[1:] } } // ryuDigits32 emits decimal digits for a number less than 1e9. func ryuDigits32(d *decimalSlice, lower, central, upper uint32, c0, cup bool, endindex int) { if upper == 0 { d.dp = endindex + 1 return } trimmed := 0 // Remember last trimmed digit to check for round-up. // c0 will be used to remember zeroness of following digits. cNextDigit := 0 for upper > 0 { // Repeatedly compute: // l = Ceil(lower / 10^k) // c = Round(central / 10^k) // u = Floor(upper / 10^k) // and stop when c goes out of the (l, u) interval. l := (lower + 9) / 10 c, cdigit := central/10, central%10 u := upper / 10 if l > u { // don't trim the last digit as it is forbidden to go below l // other, trim and exit now. break } // Check that we didn't cross the lower boundary. // The case where l < u but c == l-1 is essentially impossible, // but may happen if: // lower = ..11 // central = ..19 // upper = ..31 // and means that 'central' is very close but less than // an integer ending with many zeros, and usually // the "round-up" logic hides the problem. if l == c+1 && c < u { c++ cdigit = 0 cup = false } trimmed++ // Remember trimmed digits of c c0 = c0 && cNextDigit == 0 cNextDigit = int(cdigit) lower, central, upper = l, c, u } // should we round up? if trimmed > 0 { cup = cNextDigit > 5 || (cNextDigit == 5 && !c0) || (cNextDigit == 5 && c0 && central&1 == 1) } if central < upper && cup { central++ } // We know where the number ends, fill directly endindex -= trimmed v := central n := endindex for n > d.nd { v1, v2 := v/100, v%100 d.d[n] = smallsString[2*v2+1] d.d[n-1] = smallsString[2*v2+0] n -= 2 v = v1 } if n == d.nd { d.d[n] = byte(v + '0') } d.nd = endindex + 1 d.dp = d.nd + trimmed } // mult64bitPow10 takes a floating-point input with a 25-bit // mantissa and multiplies it with 10^q. The resulting mantissa // is m*P >> 57 where P is a 64-bit element of the detailedPowersOfTen tables. // It is typically 31 or 32-bit wide. // The returned boolean is true if all trimmed bits were zero. // // That is: // // m*2^e2 * round(10^q) = resM * 2^resE + ε // exact = ε == 0 func mult64bitPow10(m uint32, e2, q int) (resM uint32, resE int, exact bool) { if q == 0 { // P == 1<<63 return m << 6, e2 - 6, true } if q < detailedPowersOfTenMinExp10 || detailedPowersOfTenMaxExp10 < q { // This never happens due to the range of float32/float64 exponent panic("mult64bitPow10: power of 10 is out of range") } pow := detailedPowersOfTen[q-detailedPowersOfTenMinExp10][1] if q < 0 { // Inverse powers of ten must be rounded up. pow += 1 } hi, lo := bits.Mul64(uint64(m), pow) e2 += mulByLog10Log2(q) - 63 + 57 return uint32(hi<<7 | lo>>57), e2, lo<<7 == 0 } // mult128bitPow10 takes a floating-point input with a 55-bit // mantissa and multiplies it with 10^q. The resulting mantissa // is m*P >> 119 where P is a 128-bit element of the detailedPowersOfTen tables. // It is typically 63 or 64-bit wide. // The returned boolean is true is all trimmed bits were zero. // // That is: // // m*2^e2 * round(10^q) = resM * 2^resE + ε // exact = ε == 0 func mult128bitPow10(m uint64, e2, q int) (resM uint64, resE int, exact bool) { if q == 0 { // P == 1<<127 return m << 8, e2 - 8, true } if q < detailedPowersOfTenMinExp10 || detailedPowersOfTenMaxExp10 < q { // This never happens due to the range of float32/float64 exponent panic("mult128bitPow10: power of 10 is out of range") } pow := detailedPowersOfTen[q-detailedPowersOfTenMinExp10] if q < 0 { // Inverse powers of ten must be rounded up. pow[0] += 1 } e2 += mulByLog10Log2(q) - 127 + 119 // long multiplication l1, l0 := bits.Mul64(m, pow[0]) h1, h0 := bits.Mul64(m, pow[1]) mid, carry := bits.Add64(l1, h0, 0) h1 += carry return h1<<9 | mid>>55, e2, mid<<9 == 0 && l0 == 0 } func divisibleByPower5(m uint64, k int) bool { if m == 0 { return true } for i := 0; i < k; i++ { if m%5 != 0 { return false } m /= 5 } return true } // divmod1e9 computes quotient and remainder of division by 1e9, // avoiding runtime uint64 division on 32-bit platforms. func divmod1e9(x uint64) (uint32, uint32) { if !host32bit { return uint32(x / 1e9), uint32(x % 1e9) } // Use the same sequence of operations as the amd64 compiler. hi, _ := bits.Mul64(x>>1, 0x89705f4136b4a598) // binary digits of 1e-9 q := hi >> 28 return uint32(q), uint32(x - q*1e9) }