Caml1999I031dGF1-Stdlib__Float$zero%floatD@@@@)float.mlii!!i!1@@@@#one@@@@maamap@@A@)minus_one@@@@qq@@+B@#neg @,@@@0@@@@@)%negfloatAA @@@3u4u @@CC@#add!@D@@@@J@@@N@@@@@ @@ )%addfloatBA@@@@Qx * *Rx * ^@@aD@#sub"@b@@@ @h@@@ l@@@ @@@@)%subfloatBA<@@@@o{  p{  @@E@#mul#@@@@@@@@@@@@@@@)%mulfloatBAZ@@@@~  ~  @@F@#div$@@@@@@@@@@@@@@@)%divfloatBAx@@@@A 5 5A 5 i@@G@#fma%@@@@@@@@@@@@@@@@@@@@@ .caml_fma_floatC@(caml_fmaAAA@AD  E  @'unboxedE  E  @@E  E  @'noallocE  E  @@E  @@H@#rem&@@@@!@@@@"@@@#@@$@@%/caml_fmod_floatB@$fmodAA@AR  S > U@'unboxed S > A S > H@@S > >S > I@'noallocS > MS > T@@S > J@@*I@$succ'@+@@@&/@@@'@@(@-X.X(@@=J@$pred(@>@@@)B@@@*@@+@@^A^@@PK@#abs)@Q@@@,U@@@-@@.)%absfloatAA%@@@WdXd@@gL@(infinity*f@@@/@dgeg@@tM@,neg_infinity+s@@@0@qj//rj/G@@N@#nan,@@@1@~mccmcr@@O@"pi-@@@2@uu@@P@)max_float.@@@3@xx-@@Q@)min_float/@@@4@{ii{i~@@R@'epsilon0@@@5@~~@@S@)is_finite1@@@@6$boolE@@@7@@8@^^^{@@T@+is_infinite2@@@@9@@@:@@;@@@U@&is_nan3@@@@<(@@@=@@>@@@V@*is_integer4@@@@?;@@@@@@A@@@W@&of_int5@#intA@@@B@@@C@@D+%floatofintAA@@@nnn@@)X@&to_int6@*@@@E@@@F@@G+%intoffloatAA@@@01@@@Y@)of_string7@&stringO@@@HG@@@I@@J4caml_float_of_stringAA@@@IJ@@YZ@-of_string_opt8@@@@K&optionJd@@@L@@@M@@N@cNNdNw@@s[@)to_string9@t@@@O7@@@P@@Q@vw@@\@'fpclass:8@@)FP_normal(@@  @@^,FP_subnormal)@@JLJZ@@_'FP_zero*@@@@`+FP_infinite+@@@@a&FP_nan,@@@@b@@A&Stdlib'fpclass@@@R@@@@ @@A@]A@.classify_float;@@@@SK@@@T@@U3caml_classify_floatA@;caml_classify_float_unboxedA@@G@'noalloc?F@@< @@c@#pow<@@@@V@@@@W@@@X@@Y@@Z0caml_power_floatB@#powAA@A@'unboxed @@ @'noalloc @@  @@d@$sqrt=@@@@[ @@@\@@]/caml_sqrt_floatA@$sqrtA@A#//$i@'unboxed*il+is@@.ii/it@'noalloc5ix6i@@9iu@@He@$cbrt>@I@@@^M@@@_@@`/caml_cbrt_floatA@)caml_cbrtA@APQ@'unboxedWX@@[\@'noallocbc@@f@@uf@#exp?@v@@@az@@@b@@c.caml_exp_floatA@#expA@A}  ~  c@'unboxed  O  V@@  L  W@'noalloc  [  b@@  X@@g@$exp2@@@@@d@@@e@@f/caml_exp2_floatA@)caml_exp2A@A y y  @'unboxed    @@    @'noalloc    @@  @@h@#logA@@@@g@@@h@@i.caml_log_floatA@#logA@A! ! ! !X@'unboxed! !D! !K@@! !A! !L@'noalloc! !P! !W@@! !M@@i@%log10B@@@@j@@@k@@l0caml_log10_floatA@%log10A@A!t!t!!@'unboxed !! !!@@!!!!@'noalloc!!!!@@!!@@)j@$log2C@*@@@m.@@@n@@o/caml_log2_floatA@)caml_log2A@A1!!2"#"<@'unboxed8"#"(9"#"/@@<"#"%="#"0@'noallocC"#"4D"#";@@G"#"1@@Vk@%expm1D@W@@@p[@@@q@@r0caml_expm1_floatA@*caml_expm1A@A^"j"j_""@'unboxede""f""@@i""j""@'noallocp""q""@@t""@@l@%log1pE@@@@s@@@t@@u0caml_log1p_floatA@*caml_log1pA@A#6#6#x#@'unboxed#x#{#x#@@#x#x#x#@'noalloc#x##x#@@#x#@@m@#cosF@@@@v@@@w@@x.caml_cos_floatA@#cosA@A$$$$e@'unboxed$$Q$$X@@$$N$$Y@'noalloc$$]$$d@@$$Z@@n@#sinG@@@@y@@@z@@{.caml_sin_floatA@#sinA@A$$$$@'unboxed$$$$@@$$$$@'noalloc$$$$@@$$@@ o@#tanH@ @@@|@@@}@@~.caml_tan_floatA@#tanA@A%%%%S@'unboxed%%?%%F@@%%<%%G@'noalloc$%%K%%%R@@(%%H@@7p@$acosI@8@@@<@@@@@/caml_acos_floatA@$acosA@A?%~%~@%%@'unboxedF%%G%%@@J%%K%%@'noallocQ%%R%%@@U%%@@dq@$asinJ@e@@@i@@@@@/caml_asin_floatA@$asinA@Al &T&Tm &&@'unboxeds &&t &&@@w &&x &&@'noalloc~ && &&@@ &&@@r@$atanK@@@@@@@@@/caml_atan_floatA@$atanA@A',','f'}@'unboxed'f'i'f'p@@'f'f'f'q@'noalloc'f'u'f'|@@'f'r@@s@%atan2L@@@@@@@@@@@@@@@0caml_atan2_floatB@%atan2AA@A''((,@'unboxed((((@@(((( @'noalloc(($((+@@((!@@t@%hypotM@@@@@@@@@@@@@@@0caml_hypot_floatB@*caml_hypotAA@A(()9)P@'unboxed)9)< )9)C@@ )9)9 )9)D@'noalloc)9)H)9)O@@)9)E@@&u@$coshN@'@@@+@@@@@/caml_cosh_floatA@$coshA@A.!**/"**@'unboxed5"**6"**@@9"**:"**@'noalloc@"**A"**@@D"**@@Sv@$tanhO@T@@@X@@@@@/caml_tanh_floatA@$tanhA@A[%++\&+J+a@'unboxedb&+J+Mc&+J+T@@f&+J+Jg&+J+U@'noallocm&+J+Yn&+J+`@@q&+J+V@@w@%acoshP@@@@@@@@@0caml_acosh_floatA@*caml_acoshA@A)++*++@'unboxed*++*++@@*++*++@'noalloc*++*++@@*++@@x@%asinhQ@@@@@@@@@0caml_asinh_floatA@*caml_asinhA@A2,,3,,@'unboxed3,,3,,@@3,,3,,@'noalloc3,,3,,@@3,,@@y@%atanhR@@@@@@@@@0caml_atanh_floatA@*caml_atanhA@A;-}-}<--@'unboxed<--<--@@<--<--@'noalloc<--<--@@<--@@z@#erfS@@@@ @@@@@.caml_erf_floatA@(caml_erfA@AD..E..@'unboxedE..E..@@E..E..@'noalloc!E.."E..@@%E..@@4{@$erfcT@5@@@9@@@@@/caml_erfc_floatA@)caml_erfcA@A<L/g/g=M//@'unboxedCM//DM//@@GM//HM//@'noallocNM//OM//@@RM//@@a|@%truncU@b@@@f@@@@@0caml_trunc_floatA@*caml_truncA@AiU0r0rjV00@'unboxedpV00qV00@@tV00uV00@'noalloc{V00|V00@@V00@@}@%roundV@@@@@@@@@0caml_round_floatA@*caml_roundA@A\1l1l]11@'unboxed]11]11@@]11]11@'noalloc]11]11@@]11@@~@$ceilW@@@@@@@@@/caml_ceil_floatA@$ceilA@Ah3o3oi33@'unboxedi33i33@@i33i33@'noalloci33i33@@i33@@@%floorX@@@@@@@@@0caml_floor_floatA@%floorA@An4\4\o44@'unboxedo44o44@@o44o44@'noalloco44o44@@o44@@@@*next_afterY@@@@@@@@ @@@@@@@4caml_nextafter_floatB@.caml_nextafterAA@A$u5Q5Q%v55@'unboxed+v55,v55@@/v550v55@'noalloc6v557v55@@:v55@@IA@)copy_signZ@J@@@@P@@@T@@@@@@@3caml_copysign_floatB@-caml_copysignAA@AX8&8&Y8}8@'unboxed_8}8`8}8@@c8}8}d8}8@'noallocj8}8k8}8@@n8}8@@}B@(sign_bit[@~@@@@@@@@2caml_signbit_floatA@,caml_signbitA@@9{9{99@'noalloc9999@@99 @@C@%frexp\@@@@@@@ @@@@@@@Đ0caml_frexp_floatAA|@@@::::@@D@%ldexp]@@@@@@@@@@@@@@@ɐ0caml_ldexp_floatB@8caml_ldexp_float_unboxedAB@A;;> 4>?@@ CI@#minb@/@@@@4@@@7@@@@@@@@ I?U?U J?U?j@@ YJ@#maxc@ Z@@@@ `@@@ d@@@@@@@@ b@@ c@@%@@ rK@'min_maxd@ s@@@@ y@@@ @@@ @@@@@@@@@@ @@ @@@@ L@'min_nume@@@@@@@@@@@@@@@@ ACAC ACA\@@ M@'max_numf@@@@@@@@@@@@@@@@ B(B( B(BA@@ N@+min_max_numg@ @@@@ @@@ @@@ @@@@@@@@@@ C C  C C=@@ O@$hashh@@@@@@@@@@ CC CD@@ P@Ӡ%Arrayi@!tk8@@@A*floatarrayQ@@@@@@@ D[D] D[Dp@@@@ QA@&lengthl@@@@@@@@@@ DD DD@@ R@#getm@@@@@@@@ %@@@@@@@@ #E*E, $E*EG@@ 3S@#setn@+@@@@(@@@@ ?@@@$unitF@@@@@@@@@ @ CEE DEF @@ ST@$makeo@C@@@!@ Z@@@"U@@@#@@$@@%@ [FF \FF@@ kU@&createp@[@@@&g@@@'@@(@ mGG nGG@@ }V@$initq@m@@@)@@u@@@* @@@+@@,@@@-@@.@@/@ HKHM HKHr@@ W@&appendr@@@@0@@@@1@@@2@@3@@4@ II II@@ X@&concats@$listI@@@5@@@6@@@7@@8@ JJ JJ@@ Y@#subt@@@@9@@@@:@@@@;@@@<@@=@@>@@?@ JJ JK@@ Z@$copyu@@@@@@@@A@@B@ L`Lb L`Ls@@ [@$fillv@@@@C@@@@D@@@@E@ @@@F@@@G@@H@@I@@J@@K@ LL LM@@ \@$blitw@@@@L@ @@@M@@@@N@ @@@O@ !@@@P@@@Q@@R@@S@@T@@U@@V@ 4MM 5MN&@@ D]@'to_listx@<@@@W L@@@X@@@Y@@Z@ K$P&P( L$P&PE@@ [^@'of_listy@ `@@@[@@@\\@@@]@@^@ b'PP c'PP@@ r_@$iterz@@ u@@@_6@@@`@@a@v@@@b?@@@c@@d@@e@ /Q}Q /Q}Q@@ `@%iteri{@@ @@@f@ @@@gZ@@@h@@i@@j@@@@kc@@@l@@m@@n@ 4RGRI 4RGRx@@ a@#map|@@ @@@o @@@p@@q@@@@r@@@s@@t@@u@ 9SS 9SS>@@ b@$mapi}@@ @@@v@ @@@w @@@x@@y@@z@@@@{@@@|@@}@@~@ =SS =SS@@ c@)fold_left~@@!a@@ @@@ @@@@@ @@@@@@@@@@@ BTT BTT@@ d@*fold_right@@ @@@@!a@@@@@@@@@@  @@@@@@@ GUbUd !GUbU@@ 0e@%iter2@@ 3@@@@ 9@@@@@@@@@@@:@@@@?@@@@@@@@@@@@@ INVUVW JNVUV@@ Yf@$map2@@ \@@@@ b@@@ f@@@@@@@@c@@@@h@@@k@@@@@@@@@@ qSW3W5 rSW3Wh@@ g@'for_all@@ @@@ @@@@@@@@@ @@@@@@@@ [XX [XX@@ h@&exists@@ @@@ @@@@@@@@@ @@@@@@@@ `YY `YY@@ i@#mem@ @@@@@@@ @@@@@@@@ eZdZf eZdZ@@ j@(mem_ieee@ @@@@@@@ @@@@@@@@ j[7[9 j[7[Z@@ k@$sort@@ @@@@ @@@ @@@@@@@@@@@@@@@@@@@ o[[ o[[@@ l@+stable_sort@@ @@@@ @@@ @@@@@@@@@@@@@@@@@@@ %`y`{ &`y`@@ 5m@)fast_sort@@ 8@@@@ >@@@ 1@@@@@@@@?@@@@@@@@@@@ IbSbU JbSb@@ Yn@&to_seq@Q@@@ #Seq!t e@@@@@@@@@ dc c ec c+@@ to@'to_seqi@l@@@#Seq!t q@@@ޠ @@@@@@@@@@@ cc cc@@ p@&of_seq@:#Seq!t @@@@@@@@@@@@ dd dd@@ q@,map_to_array@@ @@@!a@@@@@@@%arrayH@@@@@@@@ dd de&@@ r@.map_from_array@@!a@ @@@@@@@@@@@@@@@@@ ee ef@@ s@*unsafe_get@@@@@ @@@ @@@@@@@6%floatarray_unsafe_getBA ʠ@@@@ g'g) g'gk@@ t@*unsafe_set@@@@@ @@@@@@@@@@@@@@@@6%floatarray_unsafe_setCA @@@@@!glgn"glg@@1u@@@%DHDH&gg@5v@@Ӡ+ArrayLabelsj@!t8@@@AC@@@"@@@@9hh :hh@@@@IwA@&length@@@@# =@@@$@@%@LhuhwMhuh@@\x@#get@@@@&@ Q@@@'f@@@(@@)@@*@dhhehh@@ty@#set@+@@@+@ i@@@,@@@@-A@@@.@@/@@0@@1@iiii@@z@$make@ @@@2@@@@3S@@@4@@5@@6@jtjvjtj@@{@&create@ @@@7e@@@8@@9@k5k7k5kL@@|@$init@ @@@:!f@ @@@;@@@<@@=@@@>@@?@@@@kkkl!@@}@&append@@@@A@@@@B@@@C@@D@@E@m\m^m\mv@@~@&concat@A@@@F@@@G@@@H@@I@nLnNnLnf@@@#sub@@@@J#pos @@@K#len @@@L@@@M@@N@@O@@P@nnnn@@)@$copy@@@@Q@@@R@@S@*pp+pp.@@:@$fill@@@@T#pos 1@@@U#len 9@@@V@P@@@W@@@X@@Y@@Z@@[@@\@RppSpp@@b@$blit#src@@@]'src_pos [@@@^#dst*@@@_'dst_pos j@@@`#len r@@@aD@@@b@@c@@d@@e@@f@@g@qqqr@@@'to_list@L@@@h@@@i@@@j@@k@t tt t+@@@'of_list@@@@l@@@ml@@@n@@o@totqtot@@@$iter!f@@@@p@@@q@@r@@@@s@@@t@@u@@v@ ucue ucu@@@%iteri!f@ @@@w@@@@x@@@y@@z@@{@@@@|@@@}@@~@@@v0v2v0vc@@ @#map!f@@@@@@@@@@@@@@@@@@@@@wwww+@@(@$mapi!f@@@@@3@@@7@@@@@@@@@@@@@@@@@@@=ww>ww@@M@)fold_left!f@!a@@X@@@ @@@@$init@@@@@@@@@@@_ xx` xx@@o@*fold_right!f@t@@@@!a@@@@@@6@@@$init  @@@@@@@%y[y]%y[y@@@%iter2!f@@@@@@@@]@@@@@@@@\@@@@a@@@k@@@@@@@@@@,zUzW,zUz@@@$map2!f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@1{6{81{6{m@@@'for_all!f@@@@(@@@@@@@@@1@@@@@@@@9||9||@@@&exists!f@ @@@H@@@@@@@@@Q@@@@@@@@>}}>}}@@&@#mem@'@@@#set@@@k@@@@@@@@0C~o~q1C~o~@@@@(mem_ieee@A@@@#set@@@@@@@@@@@JHGIKHGn@@Z@$sort#cmp@_@@@@e@@@X@@@@@@@@%@@@/@@@@@@@@pMqM @@@+stable_sort#cmp@@@@@@@@~@@@@@@@@K@@@U@@@@@@@@ff@@@)fast_sort#cmp@@@@@@@@@@@@@@@@q@@@{@@@@@@@@ooqoo@@@&to_seq@@@@s#Seq!t@@@@@@@@@u,.u,K@@@'to_seqi@@@@#Seq!t@@@@@@@@@@@@@@yy@@@&of_seq@#Seq!t@@@@@@@@@@@@~~@@"@,map_to_array!f@'@@@!a@@@@@@@t @@@@@@@@34H@@C@.map_from_array!f@!a@L@@@@@@@@@ @@@@@@@@T U D@@d@*unsafe_get@@@@@Y@@@n@@@@@@@ 6%floatarray_unsafe_getBA>@@@@qMOrM@@@*unsafe_set@8@@@ @v@@@ @@@@ N@@@ @@@@@@6%floatarray_unsafe_setCAa@@@@@@@@@@gg@@@@_L-Stdlib__Float0׮[eH-n;ɠ+Stdlib__Seq0yt\eǟ&Q,}.Stdlib__Either0 }rCT0J){9)&Stdlib0>,W:(8CamlinternalFormatBasics0cEXyi!)@г%floatFi!,Gi!1@@ @@@H@@@Ni!!@)ocaml.doc_ ( The floating point 0. @since 4.08.0 \j22]kL_@@@@@@@t@@@]#one hmaeimah@г#%floatqmakrmap@@ @@@0srrsssss@r?,@A@@@{maa @- ( The floating-point 1. @since 4.08.0 nqqo@@@@@@@A@@)minus_one qq@гN%floatqq@@ @@@0@,?*@A@@@q @X ) The floating-point -1. @since 4.08.0 rs@@@@@@@B@@#neg uu@б@г{%floatuu@@ @@@0@.A,@A@@г%floatuu @@ @@@@@@@@@@)%negfloatAA @@@uu @1 Unary negation. v  v  (@@@@@@@ C@@,#addx * 3x * 6@б@г%float x * 9x * >@@ @@@0@EZ3@A@@б@гР%floatx * Bx * G@@ @@@@@гݠ%float+x * K,x * P@@ @@@@@@@@!@@@'@@$* @@)%addfloatBAV@@@@>x * *?x * ^@񐠠: Floating-point addition. Ky _ _Ly _ ~@@@@@@@cD@@>#subX{  Y{  @б@г%floatc{  d{  @@ @@@0eddeeeee@Wl3@A@@б@г&%floatt{  u{  @@ @@@@@г3%float{  {  @@ @@@@@@@@!@@@'@@$* @@)%subfloatBA@@@@{  {  @G= Floating-point subtraction. |  |  @@@@@@@E@@>#mul~  ~  @б@гk%float~  ~  @@ @@@0@Wl3@A@@б@г|%float~  ~  @@ @@@@@г%float~  ~  @@ @@@@@@@@!@@@'@@$* @@)%mulfloatBA@@@@~  ~  @ Floating-point multiplication.     3@@@@@@@F@@>#divA 5 >A 5 A@б@г%floatA 5 DA 5 I@@ @@@0@Wl3@A@@б@гҠ%float A 5 M!A 5 R@@ @@@@@гߠ%float-A 5 V.A 5 [@@ @@@@@@@@!@@@'@@$* @@)%divfloatBAX@@@@@A 5 5AA 5 i@󐠠: Floating-point division. MB j jNB j @@@@@@@eG@@>#fmaZD  [D  @б@г%floateD  fD  @@ @@@0gffggggg@Wl3@A@@б@г(%floatvD  wD  @@ @@@@@б@г7%floatD  D  @@ @@@ @@гD%floatD  D  @@ @@@-@@@@@0@@@%@@3( @@@9@@6<@@.caml_fma_floatC@(caml_fmaAAA@AD  E  @'unboxedE  E  @@E  E  @'noallocE  E  @@E  @r  [fma x y z] returns [x * y + z], with a best effort for computing this expression with a single rounding, using either hardware instructions (providing full IEEE compliance) or a software emulation. On 64-bit Cygwin, 64-bit mingw-w64 and MSVC 2017 and earlier, this function may be emulated owing to known bugs on limitations on these platforms. Note: since software emulation of the fma is costly, make sure that you are using hardware fma support if performance matters. @since 4.08.0 F  P  @@@@@@@H,,@('@&h)#remR  R  @б@г%floatR  R  @@ @@@0@K@A@@б@г%floatR  R  @@ @@@@@г%floatR  R  "@@ @@@@@@@@!@@@'@@$* @@/caml_fmod_floatB@$fmodAA@AR  S > U@'unboxedS > AS > H@@"S > >#S > I@'noalloc)S > M*S > T@@-S > J@ߐ [rem a b] returns the remainder of [a] with respect to [b]. The returned value is [a -. n *. b], where [n] is the quotient [a /. b] rounded towards zero to an integer. 9T V V:V  @@@@@@@QI++@('@&U)$succGXHX@б@г%floatRXSX@@ @@@0TSSTTTTT@nJ@A@@г%floataX#bX(@@ @@@@@@@@@@@lX @ [succ x] returns the floating point number right after [x] i.e., the smallest floating-point number greater than [x]. See also {!next_after}. @since 4.08.0 xY))y\@@@@@@@J@@%$pred^^@б@гA%float^^@@ @@@0@>S,@A@@гP%float^^@@ @@@@@@@@@@@^ @[ [pred x] returns the floating-point number right before [x] i.e., the greatest floating-point number smaller than [x]. See also {!next_after}. @since 4.08.0 _b@@@@@@@K@@%#absdd@б@г~%floatdd@@ @@@0@>S,@A@@г%floatdd@@ @@@@@@@@@@)%absfloatAA@@@dd@ , [abs f] returns the absolute value of [f]. ee@@@@@@@L@@+(infinitygg @г%float gg@@ @@@0@BW0@A@@@g @ɐ4 Positive infinity. #h$h-@@@@@@@;M@@,neg_infinity/j/30j/?@гꠐ%float8j/B9j/G@@ @@@0:99:::::@,?*@A@@@Bj// @4 Negative infinity. NkHHOkHa@@@@@@@fN@@#nanZmcg[mcj@г%floatcmcmdmcr@@ @@@0eddeeeee@,?*@A@@@mmcc @ v A special floating-point value denoting the result of an undefined operation such as [0.0 /. 0.0]. Stands for 'not a number'. Any floating-point operation with [nan] as argument returns [nan] as result. As for floating-point comparisons, [=], [<], [<=], [>] and [>=] return [false] and [<>] returns [true] if one or both of their arguments is [nan]. ynsszs@@@@@@@O@@"piuu@г@%floatuu@@ @@@0@,?*@A@@@u @J2 The constant pi. vv@@@@@@@P@@)max_floatxx%@гk%floatx(x-@@ @@@0@,?*@A@@@x @u 4 The largest positive finite value of type [float]. y..y.g@@@@@@@Q@@)min_float{im{iv@г%float{iy{i~@@ @@@0@,?*@A@@@{ii @ J The smallest positive, non-zero, non-denormalized value of type [float]. ||@@@@@@@R@@'epsilon~~@г%float~~@@ @@@0@,?*@A@@@~ @ː s The difference between [1.0] and the smallest exactly representable floating-point number greater than [1.0]. %&,\@@@@@@@=S@@)is_finite1^b2^k@б@г%float<^n=^s@@ @@@0>==>>>>>@.A,@A@@г$boolK^wL^{@@ @@@@@@@@@@@V^^ @ n [is_finite x] is [true] if and only if [x] is finite i.e., not infinite and not {!nan}. @since 4.08.0 b||c@@@@@@@zT@@%+is_infiniteno@б@г+%floatyz@@ @@@0{zz{{{{{@>S,@A@@гW$bool @@ @@@@@@@@@@@ @E g [is_infinite x] is [true] if and only if [x] is {!infinity} or {!neg_infinity}. @since 4.08.0 j}@@@@@@@U@@%&is_nan @б@гh%float@@ @@@0@>S,@A@@г$bool@@ @@@@@@@@@@@ @ Y [is_nan x] is [true] if and only if [x] is not a number (see {!nan}). @since 4.08.0 @@@@@@@V@@%*is_integer!@б@г%float @@ @@@0@>S,@A@@гѠ$bool@@ @@@@@@@@@@@  @ N [is_integer x] is [true] if and only if [x] is an integer. @since 4.08.0 Yl@@@@@@@1W@@%&of_int"%nw&n}@б@гڠ#int0n1n@@ @@@021122222@>S,@A@@г%float?n@n@@ @@@@@@@@@@+%floatofintAAg@@@NnnOn@ ' Convert an integer to floating-point. [\@@@@@@@sX@@+&to_int#hi@б@г%%floatst@@ @@@0uttuuuuu@DY2@A@@г,#int@@ @@@@@@@@@@+%intoffloatAA@@@@D Truncate the given floating-point number to an integer. The result is unspecified if the argument is [nan] or falls outside the range of representable integers. @@@@@@@Y@@+)of_string$@б@г&string@@ @@@0@DY2@A@@гw%float@@ @@@@@@@@@@4caml_float_of_stringAA@@@@ ^ Convert the given string to a float. The string is read in decimal (by default) or in hexadecimal (marked by [0x] or [0X]). The format of decimal floating-point numbers is [ [-] dd.ddd (e|E) [+|-] dd ], where [d] stands for a decimal digit. The format of hexadecimal floating-point numbers is [ [-] 0(x|X) hh.hhh (p|P) [+|-] dd ], where [h] stands for an hexadecimal digit and [d] for a decimal digit. In both cases, at least one of the integer and fractional parts must be given; the exponent part is optional. The [_] (underscore) character can appear anywhere in the string and is ignored. Depending on the execution platforms, other representations of floating-point numbers can be accepted, but should not be relied upon. @raise Failure if the given string is not a valid representation of a float. +L@@@@@@@Z@@+-of_string_opt%NRN_@б@гV&stringNaNg@@ @@@0@DY2@A@@г|&optionNq Nw@гĠ%floatNkNp@@ @@@@@@@@@ @@@$@@!'@@@"NN@Ԑ = Same as [of_string], but returns [None] instead of raising. .xx/x@@@@@@@F[@)@4)to_string&:;@б@г%floatEF@@ @@@0GFFGGGGG@Mb,@A@@г&stringTU@@ @@@@@@@@@@@_ @  Return a string representation of a floating-point number. This conversion can involve a loss of precision. For greater control over the manner in which the number is printed, see {!Printf}. This function is an alias for {!Stdlib.string_of_float}. kl@@@@@@@\@@%A('fpclass'Axy@@8@@)FP_normal(@@  @5 " Normal number, none of the below  " I@@@@@@@^,FP_subnormal)@@JLJZ@K 1 Number very close to 0.0, has reduced precision JbJ@@@@@@@_'FP_zero*@@@a7 Number is 0.0 or -0.0 @@@@@@@`+FP_infinite+@@@w ) Number is positive or negative infinity @@@@@@@a&FP_nan,@@@ 0 Not a number: result of an undefined operation -b@@@@@@@b@@A'fpclass@@@@@@@@ b The five classes of floating-point numbers, as determined by the {!classify_float} function. cc@@@@@@@A@ ]@@@@@uu JNs@@@@vsee c@@@@fcUU S@@@@VSEE C@@@@FC@Aг5&Stdlib7 ' (@@>0 & % % & & & & &@8@@@A@@B@B@@@@@CA@@4@A @@DB@0 2 1 1 2 2 2 2 2@ @AE\@.classify_float- ? @@б@г%float J K@@ @@@0 L K K L L L L L@&@A@'unboxed W X@@ [ \@@г점'fpclass d e@@ @@@@@@ @@ m @@3caml_classify_floatA@;caml_classify_float_unboxedA@@ u vG@'noalloc |? }F@@ < @2 n Return the class of the given floating-point number: normal, subnormal, zero, infinite, or not a number.  HH @@@@@@@ c@@C#pow.  @б@г W%float  @@ @@@ 0        @\q>@A@@б@г h%float  @@ @@@ @@г u%float  @@ @@@ @@@@@ !@@@'@@$* @@0caml_power_floatB@#powAA@A  @'unboxed   @@   @'noalloc  @@  @1 Exponentiation.   -@@@@@@@ d++@('@&U)$sqrt/ /8 /<@б@г Ġ%float /? /D@@ @@@0        @nJ@A@@г Ӡ%float !/H "/M@@ @@@@@@@@@@/caml_sqrt_floatA@$sqrtA@A 1// 2i@'unboxed 8il 9is@@ <ii =it@'noalloc Cix Di@@ Giu@. Square root.  S T@@@@@@@ ke**@('@&B)$cbrt0 a b@б@г %float l m@@ @@@0 n m m n n n n n@[pI@A@@г -%float { |@@ @@@@@@@@@@/caml_cbrt_floatA@)caml_cbrtA@A  @'unboxed  @@  @'noalloc  @@ @ S? Cube root. @since 4.13.0     @@@@@@@ f**@('@&B)#exp1      !@б@г x%float   $   )@@ @@@0        @[pI@A@@г %float   -   2@@ @@@@@@@@@@.caml_exp_floatA@#expA@A      c@'unboxed   O   V@@   L   W@'noalloc   [   b@@   X@ . Exponential.   d d  d w@@@@@@@ g**@('@&B)$exp22  y   y @б@г Ҡ%float  y  ! y @@ @@@0 " ! ! " " " " "@[pI@A@@г ᠐%float / y  0 y @@ @@@@@@@@@@/caml_exp2_floatA@)caml_exp2A@A ? y y @  @'unboxed F   G  @@ J   K  @'noalloc Q   R  @@ U  @  1 Base 2 exponential function. @since 4.13.0  a   b!!@@@@@@@ yh**@('@&B)#log3 o! ! p! !@б@г ,%float z! ! {! !@@ @@@0 | { { | | | | |@[pI@A@@г ;%float ! !" ! !'@@ @@@@@@@@@@.caml_log_floatA@#logA@A ! !  ! !X@'unboxed ! !D ! !K@@ ! !A ! !L@'noalloc ! !P ! !W@@ ! !M@ a4 Natural logarithm.  !Y!Y !Y!r@@@@@@@ i**@('@&B)%log104 !t!} !t!@б@г %float !t! !t!@@ @@@0        @[pI@A@@г %float !t! !t!@@ @@@@@@@@ @@0caml_log10_floatA@%log10A@A !t!t !!@'unboxed !! !!@@ !! !!@'noalloc !! !!@@ !!@ 4 Base 10 logarithm.  !! !!@@@@@@@ -j**@('@&B)$log25 #!! $!!@б@г ࠐ%float .!! /!!@@ @@@!0 0 / / 0 0 0 0 0@[pI@A@@г %float =!! >!"@@ @@@"@@@@@#@@/caml_log2_floatA@)caml_log2A@A M!! N"#"<@'unboxed T"#"( U"#"/@@ X"#"% Y"#"0@'noalloc _"#"4 `"#";@@ c"#"1@  & Base 2 logarithm. @since 4.13.0  o"="= p"f"h@@@@@@@ k**@('@&B)%expm16 }"j"s ~"j"x@б@г :%float "j"{ "j"@@ @@@$0        @[pI@A@@г I%float "j" "j"@@ @@@%@@@@@&@@0caml_expm1_floatA@*caml_expm1A@A "j"j ""@'unboxed "" ""@@ "" ""@'noalloc "" ""@@ ""@ o k [expm1 x] computes [exp x -. 1.0], giving numerically-accurate results even if [x] is close to [0.0].  "" ##4@@@@@@@ l**@('@&B)%log1p7 #6#? #6#D@б@г %float #6#G #6#L@@ @@@'0        @[pI@A@@г %float #6#P #6#U@@ @@@(@@@@@)@@0caml_log1p_floatA@*caml_log1pA@A #6#6 #x#@'unboxed #x#{ #x#@@ #x#x #x#@'noalloc #x# #x#@@ #x#@ ɐ [log1p x] computes [log(1.0 +. x)] (natural logarithm), giving numerically-accurate results even if [x] is close to [0.0].  ### $#$@@@@@@@ ;m**@('@&B)#cos8 1$$  2$$#@б@г %float <$$& =$$+@@ @@@*0 > = = > > > > >@[pI@A@@г %float K$$/ L$$4@@ @@@+@@@@@,@@.caml_cos_floatA@#cosA@A [$$ \$$e@'unboxed b$$Q c$$X@@ f$$N g$$Y@'noalloc m$$] n$$d@@ q$$Z@ # " Cosine. Argument is in radians.  }$f$f ~$f$@@@@@@@ n**@('@&B)#sin9 $$ $$@б@г H%float $$ $$@@ @@@-0        @[pI@A@@г W%float $$ $$@@ @@@.@@@@@/@@.caml_sin_floatA@#sinA@A $$ $$@'unboxed $$ $$@@ $$ $$@'noalloc $$ $$@@ $$@ } Sine. Argument is in radians.  $$ $%@@@@@@@ o**@('@&B)#tan: %% %%@б@г %float %% %%@@ @@@00        @[pI@A@@г %float %%%%"@@ @@@1@@@@@2@@.caml_tan_floatA@#tanA@A%%%%S@'unboxed%%?%%F@@%%<%%G@'noalloc!%%K"%%R@@%%%H@ א # Tangent. Argument is in radians. 1%T%T2%T%|@@@@@@@Ip**@('@&B)$acos;?%~%@%~%@б@г %floatJ%~%K%~%@@ @@@30LKKLLLLL@[pI@A@@г %floatY%~%Z%~%@@ @@@4@@@@@5@@/caml_acos_floatA@$acosA@Ai%~%~j%%@'unboxedp%%q%%@@t%%u%%@'noalloc{%%|%%@@%%@ 1 } Arc cosine. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and is between [0.0] and [pi]. %%&&R@@@@@@@q**@('@&B)$asin< &T&] &T&a@б@гV%float &T&d &T&i@@ @@@60@[pI@A@@гe%float &T&m &T&r@@ @@@7@@@@@8@@/caml_asin_floatA@$asinA@A &T&T &&@'unboxed && &&@@ && &&@'noalloc && &&@@ &&@  Arc sine. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and is between [-pi/2] and [pi/2].  && &'*@@@@@@@r**@('@&B)$atan=','5','9@б@г%float','<','A@@ @@@90@[pI@A@@г%float ','E','J@@ @@@:@@@@@;@@/caml_atan_floatA@$atanA@A',','f'}@'unboxed$'f'i%'f'p@@('f'f)'f'q@'noalloc/'f'u0'f'|@@3'f'r@ 吠 J Arc tangent. Result is in radians and is between [-pi/2] and [pi/2]. ?'~'~@''@@@@@@@Ws**@('@&B)%atan2>M''N''@б@г %floatX''Y''@@ @@@<0ZYYZZZZZ@[pI@A@@б@г%floati''j''@@ @@@=@@г(%floatv''w''@@ @@@>@@@@@?!@@@'@@@$* @@0caml_atan2_floatB@%atan2AA@A''((,@'unboxed((((@@(((( @'noalloc(($((+@@((!@R [atan2 y x] returns the arc tangent of [y /. x]. The signs of [x] and [y] are used to determine the quadrant of the result. Result is in radians and is between [-pi] and [pi]. (-(-((@@@@@@@t++@('@&U)%hypot?((((@б@гw%float((()@@ @@@A0@nJ@A@@б@г%float()() @@ @@@B@@г%float()()@@ @@@C@@@@@D!@@@'@@E$* @@0caml_hypot_floatB@*caml_hypotAA@A(()9)P@'unboxed)9)<)9)C@@)9)9)9)D@'noalloc )9)H )9)O@@ )9)E@ 2 [hypot x y] returns [sqrt(x *. x + y *. y)], that is, the length of the hypotenuse of a right-angled triangle with sides of length [x] and [y], or, equivalently, the distance of the point [(x,y)] to origin. If one of [x] or [y] is infinite, returns [infinity] even if the other is [nan]. )Q)Q*f*@@@@@@@1u++@('@&U)$cosh@'!**(!**@б@г䠐%float2!**3!**@@ @@@F043344444@nJ@A@@г%floatA!**B!**@@ @@@G@@@@@H@@/caml_cosh_floatA@$coshA@AQ!**R"**@'unboxedX"**Y"**@@\"**]"**@'noallocc"**d"**@@g"**@ - Hyperbolic cosine. Argument is in radians. s#**t#*+@@@@@@@v**@('@&B)$tanhA%++%++@б@г>%float%++ %++%@@ @@@I0@[pI@A@@гM%float%++)%++.@@ @@@J@@@@@K@@/caml_tanh_floatA@$tanhA@A%++&+J+a@'unboxed&+J+M&+J+T@@&+J+J&+J+U@'noalloc&+J+Y&+J+`@@&+J+V@s . Hyperbolic tangent. Argument is in radians. '+b+b'+b+@@@@@@@w**@('@&B)%acoshB)++)++@б@г%float)++)++@@ @@@L0@[pI@A@@г%float)++)++@@ @@@M@@@@@N@@0caml_acosh_floatA@*caml_acoshA@A)++*++@'unboxed *++ *++@@*++*++@'noalloc*++*++@@*++@͐ Hyperbolic arc cosine. The argument must fall within the range [[1.0, inf]]. Result is in radians and is between [0.0] and [inf]. @since 4.13.0 '+++(0,,@@@@@@@?x**@('@&B)%asinhC52,,62,,@б@г%float@2,,A2,,@@ @@@O0BAABBBBB@[pI@A@@г%floatO2,,P2,,@@ @@@P@@@@@Q@@0caml_asinh_floatA@*caml_asinhA@A_2,,`3,,@'unboxedf3,,g3,,@@j3,,k3,,@'noallocq3,,r3,,@@u3,,@' Hyperbolic arc sine. The argument and result range over the entire real line. Result is in radians. @since 4.13.0 4,,9-y-{@@@@@@@y**@('@&B)%atanhD;-}-;-}-@б@гL%float;-}-;-}-@@ @@@R0@[pI@A@@г[%float;-}-;-}-@@ @@@S@@@@@T@@0caml_atanh_floatA@*caml_atanhA@A;-}-}<--@'unboxed<--<--@@<--<--@'noalloc<--<--@@<--@ Hyperbolic arc tangent. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and ranges over the entire real line. @since 4.13.0 =--B..@@@@@@@z**@('@&B)#erfED..D..@б@г%floatD..D..@@ @@@U0@[pI@A@@г%floatD..D..@@ @@@V@@@@@W@@.caml_erf_floatA@(caml_erfA@AD..E..@'unboxedE..E..@@E..E..@'noalloc%E..&E..@@)E..@ې Error function. The argument ranges over the entire real line. The result is always within [[-1.0, 1.0]]. @since 4.13.0 5F..6J/c/e@@@@@@@M{**@('@&B)$erfcFCL/g/pDL/g/t@б@г%floatNL/g/wOL/g/|@@ @@@X0POOPPPPP@[pI@A@@г%float]L/g/^L/g/@@ @@@Y@@@@@Z@@/caml_erfc_floatA@)caml_erfcA@AmL/g/gnM//@'unboxedtM//uM//@@xM//yM//@'noallocM//M//@@M//@5 Complementary error function ([erfc x = 1 - erf x]). The argument ranges over the entire real line. The result is always within [[-1.0, 1.0]]. @since 4.13.0 N//S0n0p@@@@@@@|**@('@&B)%truncGU0r0{U0r0@б@гZ%floatU0r0U0r0@@ @@@[0@[pI@A@@гi%floatU0r0U0r0@@ @@@\@@@@@]@@0caml_trunc_floatA@*caml_truncA@AU0r0rV00@'unboxedV00V00@@V00V00@'noallocV00V00@@V00@ u [trunc x] rounds [x] to the nearest integer whose absolute value is less than or equal to [x]. @since 4.08.0 W00Z1W1j@@@@@@@}**@('@&B)%roundH\1l1u\1l1z@б@г%float\1l1}\1l1@@ @@@^0@[pI@A@@гà%float\1l1\1l1@@ @@@_@@@@@`@@0caml_round_floatA@*caml_roundA@A!\1l1l"]11@'unboxed(]11)]11@@,]11-]11@'noalloc3]114]11@@7]11@鐠 ~ [round x] rounds [x] to the nearest integer with ties (fractional values of 0.5) rounded away from zero, regardless of the current rounding direction. If [x] is an integer, [+0.], [-0.], [nan], or infinite, [x] itself is returned. On 64-bit mingw-w64, this function may be emulated owing to a bug in the C runtime library (CRT) on this platform. @since 4.08.0 C^11Df3Z3m@@@@@@@[~**@('@&B)$ceilIQh3o3xRh3o3|@б@г%float\h3o3]h3o3@@ @@@a0^]]^^^^^@[pI@A@@г%floatkh3o3lh3o3@@ @@@b@@@@@c@@/caml_ceil_floatA@$ceilA@A{h3o3o|i33@'unboxedi33i33@@i33i33@'noalloci33i33@@i33@C Round above to an integer value. [ceil f] returns the least integer value greater than or equal to [f]. The result is returned as a float. j33l414Z@@@@@@@**@('@&B)%floorJn4\4en4\4j@б@гh%floatn4\4mn4\4r@@ @@@d0@[pI@A@@гw%floatn4\4vn4\4{@@ @@@e@@@@@f@@0caml_floor_floatA@%floorA@An4\4\o44@'unboxedo44o44@@o44o44@'noalloco44o44@@o44@ Round below to an integer value. [floor f] returns the greatest integer value less than or equal to [f]. The result is returned as a float. p44s5&5O@@@@@@@@**@('@&B)*next_afterKu5Q5Zu5Q5d@б@г %floatu5Q5gu5Q5l@@ @@@g0@[pI@A@@б@гӠ%float!u5Q5p"u5Q5u@@ @@@h@@гࠐ%float.u5Q5y/u5Q5~@@ @@@i@@@@@j!@@@'@@k$* @@4caml_nextafter_floatB@.caml_nextafterAA@ABu5Q5QCv55@'unboxedIv55Jv55@@Mv55Nv55@'noallocTv55Uv55@@Xv55@ \ [next_after x y] returns the next representable floating-point value following [x] in the direction of [y]. More precisely, if [y] is greater (resp. less) than [x], it returns the smallest (resp. largest) representable number greater (resp. less) than [x]. If [x] equals [y], the function returns [y]. If [x] or [y] is [nan], a [nan] is returned. Note that [next_after max_float infinity = infinity] and that [next_after 0. infinity] is the smallest denormalized positive number. If [x] is the smallest denormalized positive number, [next_after x 0. = 0.] @since 4.08.0 dw55e88$@@@@@@@|A++@('@&U))copy_signLr8&8/s8&88@б@г/%float}8&8;~8&8@@@ @@@l0~~@nJ@A@@б@г@%float8&8D8&8I@@ @@@m@@гM%float8&8M8&8R@@ @@@n@@@@@o!@@@'@@p$* @@3caml_copysign_floatB@-caml_copysignAA@A8&8&8}8@'unboxed8}88}8@@8}8}8}8@'noalloc8}88}8@@8}8@w [copy_sign x y] returns a float whose absolute value is that of [x] and whose sign is that of [y]. If [x] is [nan], returns [nan]. If [y] is [nan], returns either [x] or [-. x], but it is not specified which. 889b9y@@@@@@@B++@('@&U)(sign_bitM9{99{9@б@г%float9{99{9@@ @@@q0@nJ@A@'unboxed9{99{9@@9{99{9@@гӠ$bool9{99{9@@ @@@r@@@ @@s 9{9 @@2caml_signbit_floatA@,caml_signbitA@@9{9{99@'noalloc9999@@ 99 @Ґ [sign_bit x] is [true] if and only if the sign bit of [x] is set. For example [sign_bit 1.] and [signbit 0.] are [false] while [sign_bit (-1.)] and [sign_bit (-0.)] are [true]. @since 4.08.0 ,99-::@@@@@@@DC@@C%frexpN:::;::@б@г%floatE::F::@@ @@@t0GFFGGGGG@\q>@A@@Вг %floatW::X::@@ @@@u@@г#inte::f::@@ @@@v @@@@@w% @@@+@@x(. @@0caml_frexp_floatAA@@@y::z::@,  [frexp f] returns the pair of the significant and the exponent of [f]. When [f] is zero, the significant [x] and the exponent [n] of [f] are equal to zero. When [f] is non-zero, they are defined by [f = x *. 2 ** n] and [0.5 <= x < 1.0]. ::;;@@@@@@@D@@A%ldexpO;;;<@б@гP%float;<;< @@ @@@y0@Zo2@A@'unboxed;<;<@@;< ;<@@б@гd#int;<;< @@ @@@z@(untagged;<#;<+@@;>@@@@@@@H@@7%equalS>>>>@б@г!t>>>>@@ @@@0@Pe,@A@@б@г!t>>>>@@ @@@@@г$bool">>#>?@@ @@@@@@@@!@@@'@@$* @@@0>>@␠ K The equal function for floating-point numbers, compared using {!compare}. <??=??S@@@@@@@TI@@7#minTH?U?YI?U?\@б@гࠐ!tS?U?_T?U?`@@ @@@0UTTUUUUU@Pe,@A@@б@г!td?U?de?U?e@@ @@@@@г!tq?U?ir?U?j@@ @@@@@@@@!@@@'@@$* @@@?U?U@1 [min x y] returns the minimum of [x] and [y]. It returns [nan] when [x] or [y] is [nan]. Moreover [min (-0.) (+0.) = -0.] @since 4.08.0 ?k?k?@@@@@@@@J@@7#maxU@@@@ @б@гT%float@@@@@@ @@@0@Pe,@A@@б@гe%float@@@@@@ @@@@@гr%float@@ @@%@@ @@@@@@@@!@@@'@@$* @@@@@@ [max x y] returns the maximum of [x] and [y]. It returns [nan] when [x] or [y] is [nan]. Moreover [max (-0.) (+0.) = +0.] @since 4.08.0 @&@&@@@@@@@@@K@@7'min_maxV@@@@@б@г%float@@@@@@ @@@0@Pe,@A@@б@г%float@@@@@@ @@@@@ВгĠ%float@@@@@@ @@@!@@гҠ%float @@!@@@@ @@@/@@@@@4 @@@)@@7, @@@=@@:@@@@3@@@吠 O [min_max x y] is [(min x y, max x y)], just more efficient. @since 4.08.0 ?@@@A.AA@@@@@@@WL@"@M'min_numWKACAGLACAN@б@г㠐!tVACAQWACAR@@ @@@0XWWXXXXX@f{,@A@@б@г!tgACAVhACAW@@ @@@@@г!ttACA[uACA\@@ @@@@@@@@!@@@'@@$* @@@ACAC@4 [min_num x y] returns the minimum of [x] and [y] treating [nan] as missing values. If both [x] and [y] are [nan], [nan] is returned. Moreover [min_num (-0.) (+0.) = -0.] @since 4.08.0 A]A]BB&@@@@@@@M@@7'max_numXB(B,B(B3@б@г2!tB(B6B(B7@@ @@@0@Pe,@A@@б@гC!tB(B;B(B<@@ @@@@@гP!tB(B@B(BA@@ @@@@@@@@!@@@'@@$* @@@B(B(@ [max_num x y] returns the maximum of [x] and [y] treating [nan] as missing values. If both [x] and [y] are [nan] [nan] is returned. Moreover [max_num (-0.) (+0.) = +0.] @since 4.08.0 BBBBBC @@@@@@@N@@7+min_max_numYC CC C@б@г%floatC CC C#@@ @@@0@Pe,@A@@б@г%floatC C'C C,@@ @@@@@ВгǠ%floatC C0C C5@@ @@@!@@гՠ%float#C C8$C C=@@ @@@/@@@@@4 @@@)@@7, @@@=@@:@@@@6C C @萠 [min_max_num x y] is [(min_num x y, max_num x y)], just more efficient. Note that in particular [min_max_num x nan = (x, x)] and [min_max_num nan y = (y, y)]. @since 4.08.0 BC>C>CCC@@@@@@@ZO@"@M$hashZNCDOCD@б@г栐!tYCD ZCD @@ @@@0[ZZ[[[[[@f{,@A@@г#inthCDiCD@@ @@@@@@@@@@@sCC @% / The hash function for floating-point numbers. DDDDF@@@@@@@P@@%%ArrayCDHDODHDT@@БA(!t[DD[DbD[Dc@@8@@@AT@@@@@@@D[D]D[Dp@W N The type of float arrays with packed representation. @since 4.08.0 DqDsDD@@@@@@@@@Q@@Aг*floatarrayD[Df@@0@`uN(8@@@A/@@E@E@@@@@$!@@@A #@@%"@0@ @A&%@&length\DDDD@б@гB!tDDDD@@ @@@0@&MG@A@@г#intDDDD@@ @@@@@@@@@@@DD @ A Return the length (number of elements) of the given floatarray. DDDE(@@@@@@@R@@%#get]E*E0E*E3@б@г!tE*E6E*E7@@ @@@0@>S,@A@@б@гՠ#int+E*E;,E*E>@@ @@@@@гꠐ%float8E*EB9E*EG@@ @@@@@@@@!@@@'@@$* @@@FE*E,@ [get a n] returns the element number [n] of floatarray [a]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)]. REHEJSEE@@@@@@@jS@@7#set^^EE_EE@б@гΠ!tiEEjEE@@ @@@0kjjkkkkk@Pe,@A@@б@г$#intzEE{EE@@ @@@@@б@г;%floatEEEF@@ @@@ @@г$unitEFEF @@ @@@-@@@@@0@@@%@@3( @@@9@@6<@@@EE@Y [set a n x] modifies floatarray [a] in place, replacing element number [n] with [x]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)]. F F FF@@@@@@@T@ @I$make_FFFF@б@гt#intFFFF@@ @@@0@bw,@A@@б@г%floatFFFF@@ @@@@@гM!tFFFF@@ @@@@@@@@!@@@'@@$* @@@FF@ [make n x] returns a fresh floatarray of length [n], initialized with [x]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. FFG7G@@@@@@@U@@7&create`GGGG@б@гà#intGGGG@@ @@@0@Pe,@A@@г!t(GG)GG@@ @@@@@@@@@@@3GG @吠 [create n] returns a fresh floatarray of length [n], with uninitialized data. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. ?GG@GHI@@@@@@@WV@@%$initaKHKHQLHKHU@б@г#intVHKHXWHKH[@@ @@@0XWWXXXXX@>S,@A@@б@б@г#intiHKH`jHKHc@@ @@@@@г(%floatvHKHgwHKHl@@ @@@ @@@@@#@@г렐!tHKHqHKHr@@ @@@0@@@@@3HKH_ @@@:@@7= @@@HKHM@G / [init n f] returns a fresh floatarray of length [n], with element number [i] initialized to the result of [f i]. In other terms, [init n f] tabulates the results of [f] applied to the integers [0] to [n-1]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. HsHuIZI@@@@@@@W@@J&appendbIIII@б@г!tIIII@@ @@@0@cx,@A@@б@г.!tIIII@@ @@@@@г;!tIIII@@ @@@@@@@@!@@@'@@$* @@@II@ [append v1 v2] returns a fresh floatarray containing the concatenation of the floatarrays [v1] and [v2]. @raise Invalid_argument if [length v1 + length v2 > Sys.max_floatarray_length]. IIJ\J@@@@@@@X@@7&concatcJJJJ@б@г$listJJJJ@гv!tJJJJ@@ @@@0@Zo6@A@@@ @@@ @@г!t%JJ&JJ@@ @@@@@@@@@@@0JJ @␠ < Same as {!append}, but concatenates a list of floatarrays. <JJ=JJ@@@@@@@TY@@*#subdHJKIJK@б@г!tSJKTJK@@ @@@0UTTUUUUU@Cb,@A@@б@г#intdJK eJK@@ @@@@@б@г#intsJKtJK@@ @@@ @@г堐!tJKJK@@ @@@-@@@@@0@@@%@@3( @@@9@@6<@@@JJ@C ; [sub a pos len] returns a fresh floatarray of length [len], containing the elements number [pos] to [pos + len - 1] of floatarray [a]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a]; that is, if [pos < 0], or [len < 0], or [pos + len > length a]. KK L"L^@@@@@@@Z@ @I$copyeL`LfL`Lj@б@г!tL`LmL`Ln@@ @@@0@bw,@A@@г(!tL`LrL`Ls@@ @@@@@@@@@@@L`Lb @ h [copy a] returns a copy of [a], that is, a fresh floatarray containing the same elements as [a]. LtLvLL@@@@@@@[@@%$fillfLLLL@б@гV!tLLLL@@ @@@0@>S,@A@@б@г#intLLLL@@ @@@@@б@г#intLLLM@@ @@@ @@б@гҠ%float LM!LM @@ @@@/@@г$unit-LM.LM@@ @@@<@@@@@?@@@%@@B( @@@7@@E:@@@K@@HN@@@ALL@󐠠 [fill a pos len x] modifies the floatarray [a] in place, storing [x] in elements number [pos] to [pos + len - 1]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a]. MMMNMM@@@@@@@e\@#@[$blitgYMMZMN@б@гɠ!tdMNeMN@@ @@@0feefffff@t,@A@@б@г#intuMNvMN @@ @@@@@б@г預!tMNMN@@ @@@ @@б@г=#intMNMN@@ @@@/@@б@гL#intMNMN@@ @@@>@@г$unitMN"MN&@@ @@@K@@@@@N@@@%@@Q( @@@7@@T:@@@I@@WL@@@]@@ Z`@@@MM@x  [blit src src_pos dst dst_pos len] copies [len] elements from floatarray [src], starting at element number [src_pos], to floatarray [dst], starting at element number [dst_pos]. It works correctly even if [src] and [dst] are the same floatarray, and the source and destination chunks overlap. @raise Invalid_argument if [src_pos] and [len] do not designate a valid subarray of [src], or if [dst_pos] and [len] do not designate a valid subarray of [dst]. N'N)"OP$@@@@@@@]@&@m'to_listh$P&P,$P&P3@б@гN!t$P&P6$P&P7@@ @@@ 0@,@A@@г$list$P&PA$P&PE@г%float$P&P;$P&P@@@ @@@ @@@@@@  @@@$@@!'@@@$P&P(@Đ : [to_list a] returns the list of all the elements of [a]. %PFPH%PFP@@@@@@@6^@)@4'of_listi*'PP+'PP@б@гʠ$list5'PP6'PP@г%float?'PP@'PP@@ @@@0A@@AAAAA@Wl6@A@@@ @@@ @@г!tS'PPT'PP@@ @@@@@@@@@@@^'PP @ [of_list l] returns a fresh floatarray containing the elements of [l]. @raise Invalid_argument if the length of [l] is greater than [Sys.max_floatarray_length].j(PPk+Q?Qc@@@@@@@_@@*/ {2 Iterators} {-QeQg|-QeQ{@@@@@@0zyyzzzzz@:Y#@A$iterj/Q}Q/Q}Q@б@б@гF%float/Q}Q/Q}Q@@ @@@@@г$unit/Q}Q/Q}Q@@ @@@)@@@@@,@@б@г!t/Q}Q/Q}Q@@ @@@;@@г$unit/Q}Q/Q}Q@@ @@@H@@@@@K@@@$@@N/Q}Q @@@/Q}Q@ [iter f a] applies function [f] in turn to all the elements of [a]. It is equivalent to [f a.(0); f a.(1); ...; f a.(length a - 1); ()]. 0QQ2R RE@@@@@@@`@@b%iterik4RGRM4RGRR@б@б@г#int4RGRV4RGRY@@ @@@0@}x.@A@@б@г%float4RGR]4RGRb@@ @@@@@гk$unit4RGRf4RGRj@@ @@@@@@@@!@@@'@@$* @@б@г!t'4RGRo(4RGRp@@ @@@ 3@@г$unit44RGRt54RGRx@@ @@@!@@@@@@"C@@@$@@#F@4RGRU @@@C4RGRI@ Same as {!iter}, but the function is applied with the index of the element as first argument, and the element itself as second argument. O5RyR{P7RS@@@@@@@ga@@Z#mapl[9SS\9SS!@б@б@г%floath9SS%i9SS*@@ @@@$0jiijjjjj@u.@A@@г)%floatw9SS.x9SS3@@ @@@%@@@@@&@@б@г!t9SS89SS9@@ @@@'!@@г!t9SS=9SS>@@ @@@(.@@@@@)1@@@$@@*49SS$ @@@9SS@W | [map f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f]. :S?SA;SS@@@@@@@b@@H$mapim=SS=SS@б@б@гt#int=SS=SS@@ @@@+0@cz.@A@@б@г%float=SS=SS@@ @@@,@@г%float=SS=SS@@ @@@-@@@@@.!@@@'@@/$* @@б@гb!t=SS=SS@@ @@@03@@гo!t =SS =SS@@ @@@1@@@@@@2C@@@$@@3F =SS @@@ =SS@ː Same as {!map}, but the function is applied to the index of the element as first argument, and the element itself as second argument.  %>SS &@TZT@@@@@@@ =c@@Z)fold_leftn 1BTT 2BTT@б@б@А!a@=E@40 < ; ; < < < < <@q*@A BBTT CBTT@@б@г%float MBTT NBTT@@ @@@5@@А!a WBTT XBTT@@@ !@@6@@@$@@7@@б@А!a*% eBTT fBTT@@б@гՠ!t pBTT qBTT@@ @@@86@@А!a?: zBTT {BTT@@@ D@@9?@@@G@@:B@@@(@@;E BTT @@@ BTT@: [fold_left f x init] computes [f (... (f (f x init.(0)) init.(1)) ...) init.(n-1)], where [n] is the length of the floatarray [init].  CTT EU&U`@@@@@@@ d@@Y*fold_righto GUbUh GUbUr@б@б@г _%float GUbUv GUbU{@@ @@@>0        @t.@A@@б@А!a@GE@?  GUbU GUbU@@А!a  GUbU GUbU@@@@@@ @@@@@A!@@б@г@@@(@@EA GUbUu @@@ GUbUd@ [fold_right f a init] computes [f a.(0) (f a.(1) ( ... (f a.(n-1) init) ...))], where [n] is the length of the floatarray [a]. !HUU!JUV-@@@@@@@!e@@U!= {2 Iterators on two arrays} !LV/V1!LV/VS@@@@@@0!!!!!!!!@e|#@A%iter2p! NVUV[!!NVUV`@б@б@г ߠ%float!-NVUVd!.NVUVi@@ @@@H@@б@г %float!<NVUVm!=NVUVr@@ @@@I+@@г $unit!INVUVv!JNVUVz@@ @@@J8@@@@@K;@@@%@@L>( @@б@гà!t!^NVUV!_NVUV@@ @@@MM@@б@гҠ!t!mNVUV!nNVUV@@ @@@N\@@г Ӡ$unit!zNVUV!{NVUV@@ @@@Oi@@@@@Pl@@@%@@Qo( @@@6@@Rr!NVUVc@@@!NVUVW@ > [Array.iter2 f a b] applies function [f] to all the elements of [a] and [b]. @raise Invalid_argument if the floatarrays are not the same size. !OVV!QVW1@@@@@@@!f@!@$map2q!SW3W9!SW3W=@б@б@г!c%float!SW3WA!SW3WF@@ @@@S0!!!!!!!!@.@A@@б@г!t%float!SW3WJ!SW3WO@@ @@@T@@г!%float!SW3WS!SW3WX@@ @@@U@@@@@V!@@@'@@W$* @@б@гI!t!SW3W]!SW3W^@@ @@@X3@@б@гX!t!SW3Wb!SW3Wc@@ @@@YB@@гe!t"SW3Wg"SW3Wh@@ @@@ZO@@@@@[R@@@%@@\U( @@@6@@]X"SW3W@@@@"SW3W5@ Đ  [map2 f a b] applies function [f] to all the elements of [a] and [b], and builds a floatarray with the results returned by [f]: [[| f a.(0) b.(0); ...; f a.(length a - 1) b.(length b - 1)|]]. @raise Invalid_argument if the floatarrays are not the same size. "TWiWk"WX;X@@@@@@@"6g@!@l"44 {2 Array scanning} "/YXX"0YXX@@@@@@0"."-"-".".".".".@|#@A'for_allr";[XX"<[XX@б@б@г!%float"H[XX"I[XX@@ @@@^@@г"$$bool"U[XX"V[XX@@ @@@_)@@@@@`,@@б@г̠!t"g[XX"h[XX@@ @@@a;@@г"C$bool"t[XX"u[XX@@ @@@bH@@@@@cK@@@$@@dN"[XX @@@"[XX@!5 [for_all f [|a1; ...; an|]] checks if all elements of the floatarray satisfy the predicate [f]. That is, it returns [(f a1) && (f a2) && ... && (f an)]. "\XX"^YQY~@@@@@@@"h@@b&existss"`YY"`YY@б@б@г"Z%float"`YY"`YY@@ @@@e0""""""""@}x.@A@@г"$bool"`YY"`YY@@ @@@f@@@@@g@@б@г .!t"`YY"`YY@@ @@@h!@@г"$bool"`YY"`YY@@ @@@i.@@@@@j1@@@$@@k4"`YY @@@"`YY@! [exists f [|a1; ...; an|]] checks if at least one element of the floatarray satisfies the predicate [f]. That is, it returns [(f a1) || (f a2) || ... || (f an)]. "aYY"cZ5Zb@@@@@@@# i@@H#memt"eZdZj"eZdZm@б@г"%float#eZdZp# eZdZu@@ @@@l0# # # # # # # # @ax,@A@@б@г ~!t#eZdZy#eZdZz@@ @@@m@@г"$bool#&eZdZ~#'eZdZ@@ @@@n@@@@@o!@@@'@@p$* @@@#4eZdZf@!搠 [mem a set] is true if and only if there is an element of [set] that is structurally equal to [a], i.e. there is an [x] in [set] such that [compare a x = 0]. #@fZZ#Ah[[5@@@@@@@#Xj@@7(mem_ieeeu#Lj[7[=#Mj[7[E@б@г# %float#Wj[7[H#Xj[7[M@@ @@@q0#Y#X#X#Y#Y#Y#Y#Y@Pe,@A@@б@г ͠!t#hj[7[Q#ij[7[R@@ @@@r@@г#D$bool#uj[7[V#vj[7[Z@@ @@@s@@@@@t!@@@'@@u$* @@@#j[7[9@"5 H Same as {!mem}, but uses IEEE equality instead of structural equality. #k[[[]#k[[[@@@@@@@#k@@7#- {2 Sorting} #m[[#m[[@@@@@@0########@G\#@A$sortv#o[[#o[[@б@б@г#k%float#o[[#o[[@@ @@@v@@б@г#z%float#o[[#o[[@@ @@@w+@@г##int#o[[#o[[@@ @@@x8@@@@@y;@@@%@@z>( @@б@г O!t#o[[#o[[@@ @@@{M@@г#P$unit#o[[#o[[@@ @@@|Z@@@@@}]@@@$@@~`$o[[ @@@$o[[@" | Sort a floatarray in increasing order according to a comparison function. The comparison function must return 0 if its arguments compare as equal, a positive integer if the first is greater, and a negative integer if the first is smaller (see below for a complete specification). For example, {!Stdlib.compare} is a suitable comparison function. After calling [sort], the array is sorted in place in increasing order. [sort] is guaranteed to run in constant heap space and (at most) logarithmic stack space. The current implementation uses Heap Sort. It runs in constant stack space. Specification of the comparison function: Let [a] be the floatarray and [cmp] the comparison function. The following must be true for all [x], [y], [z] in [a] : - [cmp x y] > 0 if and only if [cmp y x] < 0 - if [cmp x y] >= 0 and [cmp y z] >= 0 then [cmp x z] >= 0 When [sort] returns, [a] contains the same elements as before, reordered in such a way that for all i and j valid indices of [a] : - [cmp a.(i) a.(j)] >= 0 if and only if i >= j $p[[$`s`w@@@@@@@$*l@@t+stable_sortw$`y`$`y`@б@б@г#ݠ%float$+`y`$,`y`@@ @@@0$-$,$,$-$-$-$-$-@.@A@@б@г#%float$<`y`$=`y`@@ @@@@@г##int$I`y`$J`y`@@ @@@@@@@@!@@@'@@$* @@б@г à!t$^`y`$_`y`@@ @@@3@@г#Ġ$unit$k`y`$l`y`@@ @@@@@@@@@C@@@$@@F$w`y` @@@$z`y`{@#,  Same as {!sort}, but the sorting algorithm is stable (i.e. elements that compare equal are kept in their original order) and not guaranteed to run in constant heap space. The current implementation uses Merge Sort. It uses a temporary floatarray of length [n/2], where [n] is the length of the floatarray. It is usually faster than the current implementation of {!sort}. $``$bbQ@@@@@@@$m@@Z)fast_sortx$bSbY$bSbb@б@б@г$Q%float$bSbf$bSbk@@ @@@0$$$$$$$$@u.@A@@б@г$b%float$bSbo$bSbt@@ @@@@@г$g#int$bSbx$bSb{@@ @@@@@@@@!@@@'@@$* @@б@г 7!t$bSb$bSb@@ @@@3@@г$8$unit$bSb$bSb@@ @@@@@@@@@C@@@$@@F$bSbe @@@$bSbU@# P Same as {!sort} or {!stable_sort}, whichever is faster on typical input. $bb$bb@@@@@@@%n@@Z% {2 Float arrays and Sequences} % bb% bc @@@@@@0% % % % % % % % @j#@A&to_seq%c c%c c@б@г !t%"c c%#c c@@ @@@@@г##Seq!t%2c c&%3c c+@г$%float%<c c %=c c%@@ @@@ ~4@@@@@@ 9 @@@%@@ <(@@@%Lc c@# Iterate on the floatarray, in increasing order. Modifications of the floatarray during iteration will be reflected in the sequence. %Xc,c.%Ycwc@@@@@@@%po@)@O'to_seqi%dcc%ecc@б@г Ԡ!t%occ%pcc@@ @@@ 0%q%p%p%q%q%q%q%q@hc,@A@@г$I#Seq!t%cc%cc@Вг%8#int%cc%cc@@ @@@ @@г%N%float%cc%cc@@ @@@ -@@@@@ 2 @@@0@@@ 7%cc+@@@>@@ ;A.@@@%cc1@$d Iterate on the floatarray, in increasing order, yielding indices along elements. Modifications of the floatarray during iteration will be reflected in the sequence. %cc%dd@@@@@@@%p@@@N&of_seq%dd%dd@б@г$#Seq!t%dd%dd@г%%float%dd%dd@@ @@@ 0%%%%%%%%@t9@A@@@ @@@  @@г [!t%dd%dd@@ @@@ @@@@@ @@@&dd @$ % Create an array from the generator. & dd&dd@@@@@@@&%q@@*,map_to_array&dd&de@б@б@г%ؠ%float&&de &'de@@ @@@ 0&(&'&'&(&(&(&(&(@Eg.@A@@А!a@ E@  &7de&8de@@@ @@ @@б@г !t&Ede&Fde@@ @@@ @@г&*%array&Rde!&Sde&@А!a'-&Yde&Zde @@@-@@@ 4 @@@@@ 7@@@,@@ :&fde@@@&idd@% [map_to_array f a] applies function [f] to all the elements of [a], and builds an array with the results returned by [f]: [[| f a.(0); f a.(1); ...; f a.(length a - 1) |]]. &ue'e)&vee@@@@@@@&r@&@N.map_from_array&ee&ee@б@б@А!a@ E@ 0&&&&&&&&@e|*@A&ef&ef@@г&M%float&ef&ef @@ @@@ @@@@@ @@б@г&%array&ef&ef@А!a)$&ef&ef@@@/@@@ + @@г '!t&ef&ef@@ @@@ 8@@@@@ ;@@@,@@ >&ef @@@&ee@% [map_from_array f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f]. &f f"&flf@@@@@@@&s@@R&󐠠"/*&ff&ff@@@@@@0&&&&&&&&@bu#@A'< {2 Undocumented functions} &ff'ff@@@@@@*unsafe_get' g'g2' g'g<@б@г y!t'g'g?'g'g@@@ @@@ )@@б@г&͠#int'#g'gD'$g'gG@@ @@@ 8@@г&⠐%float'0g'gK'1g'gP@@ @@@ E@@@@@ H@@@%@@ K( @@6%floatarray_unsafe_getBA%[@@@@'Cg'g)'Dg'gk@@'[t@@@X*unsafe_set'Pglgw'Qglg@б@г !t'[glg'\glg@@ @@@ 0']'\'\']']']']']@q]&@A@@б@г'#int'lglg'mglg@@ @@@ @@б@г'-%float'{glg'|glg@@ @@@  @@г&᠐$unit'glg'glg@@ @@@ -@@@@@ 0@@@%@@ 3( @@@9@@ 6<@@6%floatarray_unsafe_setCA%@@@@@'glgn'glg@@'u @@@D@ A@  @  f@ R @  @  @ k @  @  @ t )@  @  }@ i @  @  f@ A@@q%@@F@2@F@2@S@?@@Y@4@f@R@@4@ @@m@@W@@0''''''''@Y@AM0''''''''@4@A'DHDW'gg@@& * Float arrays with packed representation. (gg(gg@@@@@@@(DHDH@@+ArrayLabelsE(gg(gh@@БA(!tF(hh(hh@@8@@@A'@@@ @@@@(&hh ('hh@&ِ N The type of float arrays with packed representation. @since 4.08.0 (3hh (4hmhs@@@@@@@@@(Kw@@Aг*floatarray(=hh@@0(;(:(:(;(;(;(;(;@@A@yR@>@  @  Y@ E @  @  q@ ] '@  @  @ y @  @  O@ ; @  @  $@ @R@>@x@S@a@<@@~E@1@w@c@@n7@#@@r @ @O@A@@(vu8@@@A|@@G@ G@ @@@@qn@@a@AZp@@ro@0((((((((@X@Asr@&length(huh{(huh@б@г!t(huh(huh@@ @@@ 0((((((((@s@A@@г(e#int(huh(huh@@ @@@ @@@@@ @@@(huhw @'x A Return the length (number of elements) of the given floatarray. (hh(hh@@@@@@@(x@@%#get(hh(hh@б@г̠!t(hh(hh@@ @@@ 0((((((((@>S,@A@@б@г(#int(hh(hh@@ @@@ @@г(%float)hh)hh@@ @@@ @@@@@ !@@@'@@ $* @@@)hh@'ǐ [get a n] returns the element number [n] of floatarray [a]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)]. )!hh)"ivi@@@@@@@)9y@@7#set)-ii).ii@б@г!t)8ii)9ii@@ @@@ 0):)9)9):):):):):@Pe,@A@@б@г(#int)Iii)Jii@@ @@@ @@б@г) %float)Xii)Yii@@ @@@  @@г($unit)eii)fii@@ @@@ -@@@@@ 0@@@%@@ 3( @@@9@@ 6<@@@)vii@(( [set a n x] modifies floatarray [a] in place, replacing element number [n] with [x]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)]. )ii)jXjr@@@@@@@)z@ @I$make)jtjz)jtj~@б@г)C#int)jtj)jtj@@ @@@ 0))))))))@bw,@A@@б@г)\%float)jtj)jtj@@ @@@ @@г!t)jtj)jtj@@ @@@ @@@@@ !@@@'@@ $* @@@)jtjv@(w [make n x] returns a fresh floatarray of length [n], initialized with [x]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. )jj)jk3@@@@@@@){@@7&create)k5k;)k5kA@б@г)#int)k5kD)k5kG@@ @@@ 0))))))))@Pe,@A@@гڠ!t)k5kK)k5kL@@ @@@ @@@@@ @@@*k5k7 @( [create n] returns a fresh floatarray of length [n], with uninitialized data. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. *kMkO*kk@@@@@@@*&|@@%$init *kk*kl@б@г)Ϡ#int*%kl*&kl@@ @@@ 0*'*&*&*'*'*'*'*'@>S,@A@@б!fб@г)䠐#int*:kl*;kl@@ @@@ @@г)%float*Gkl*Hkl@@ @@@ "@@@@@ %@@г:!t*Wkl *Xkl!@@ @@@ 2@@0@@ 5*`kl  @@@<@@ 9? @@@*fkk@) 1 [init n ~f] returns a fresh floatarray of length [n], with element number [i] initialized to the result of [f i]. In other terms, [init n ~f] tabulates the results of [f] applied to the integers [0] to [n-1]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. *rl"l$*sm mZ@@@@@@@*}@@L&appendà*~m\mb*m\mh@б@гl!t*m\mk*m\ml@@ @@@ 0********@ez,@A@@б@г}!t*m\mp*m\mq@@ @@@ @@г!t*m\mu*m\mv@@ @@@ @@@@@ !@@@'@@ $* @@@*m\m^@)g [append v1 v2] returns a fresh floatarray containing the concatenation of the floatarrays [v1] and [v2]. @raise Invalid_argument if [length v1 + length v2 > Sys.max_floatarray_length]. *mwmy*n nJ@@@@@@@*~@@7&concatĠ*nLnR*nLnX@б@г*m$list*nLn]*nLna@гŠ!t*nLn[*nLn\@@ @@@ 0********@Zo6@A@@@ @@@  @@г٠!t*nLne*nLnf@@ @@@ @@@@@ @@@+nLnN @) < Same as {!append}, but concatenates a list of floatarrays. + ngni+ngn@@@@@@@+%@@*#subŠ+nn+nn@б@г!t+$nn+%nn@@ @@@ 0+&+%+%+&+&+&+&+&@Cb,@A@@б#posг*᠐#int+7nn+8nn@@ @@@ @@б#lenг*#int+Hnn+Inn@@ @@@ $@@г8!t+Unn+Vnn@@ @@@ 1@@@@ 4+^nn @@3(@@ 8+bnn @@@?@@ <B@@@+hnn@* = [sub a ~pos ~len] returns a fresh floatarray of length [len], containing the elements number [pos] to [pos + len - 1] of floatarray [a]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a]; that is, if [pos < 0], or [len < 0], or [pos + len > length a]. +tnn+uop@@@@@@@+@"@O$copyƠ+pp!+pp%@б@гn!t+pp(+pp)@@ @@@ 0++++++++@h},@A@@г}!t+pp-+pp.@@ @@@ @@@@@ @@@+pp @*W h [copy a] returns a copy of [a], that is, a fresh floatarray containing the same elements as [a]. +p/p1+pqp@@@@@@@+@@%$fillǠ+pp+pp@б@г!t+pp+pp@@ @@@ 0++++++++@>S,@A@@б#posг+#int+pp+pp@@ @@@ @@б#lenг+#int+pp+pp@@ @@@ $@@б@г+%float+pp+pp@@ @@@ 3@@г+a$unit,pp, pp@@ @@@ @@@@@@ C@@0%@@ F,pp @@E:@@ J,pp@@@Q@@ NT@@@,pp@*А [fill a ~pos ~len x] modifies the floatarray [a] in place, storing [x] in elements number [pos] to [pos + len - 1]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a]. ,*pp,+qq@@@@@@@,B@%@a$blitȠ,6qq,7qq@б#srcг&!t,Cqq,Dqq@@ @@@ 0,E,D,D,E,E,E,E,E@|.@A@@б'src_posг,#int,Vqq,Wqq@@ @@@ @@б#dstгJ!t,gqq,hqq@@ @@@ $@@б'dst_posг,"#int,xqq,yqq@@ @@@ 5@@б#lenг,3#int,qq,qq@@ @@@ F@@г+$unit,qr,qr@@ @@@ S@@@@ V,qq @@3(@@ Z,qq @@H=@@ ^,qq@@]R@@ b,qq@@ti@@ f,qq@@@,qq@+d  [blit ~src ~src_pos ~dst ~dst_pos ~len] copies [len] elements from floatarray [src], starting at element number [src_pos], to floatarray [dst], starting at element number [dst_pos]. It works correctly even if [src] and [dst] are the same floatarray, and the source and destination chunks overlap. @raise Invalid_argument if [src_pos] and [len] do not designate a valid subarray of [src], or if [dst_pos] and [len] do not designate a valid subarray of [dst]. ,rr ,st @@@@@@@,@+@z'to_listɠ,t t,t t@б@г!t,t t,t t@@ @@@ 0,,,,,,,,@,@A@@г,y$list,t t',t t+@г,%float,t t!,t t&@@ @@@ @@@@@@  @@@$@@ !'@@@,t t@+ : [to_list a] returns the list of all the elements of [a]. - t,t.- t,tm@@@@@@@-"@)@4'of_listʠ-totu-tot|@б@г,$list-!tot-"tot@г,ݠ%float-+tot-,tot@@ @@@ 0---,-,----------@Wl6@A@@@ @@@  @@г"!t-?tot-@tot@@ @@@ @@@@@ @@@-Jtotq @+ [of_list l] returns a fresh floatarray containing the elements of [l]. @raise Invalid_argument if the length of [l] is greater than [Sys.max_floatarray_length].-Vtt-W u%uI@@@@@@@-n@@*-l/ {2 Iterators} -g uKuM-h uKua@@@@@@0-f-e-e-f-f-f-f-f@:Y#@A$iterˠ-s ucui-t ucum@б!fб@г-4%float- ucus- ucux@@ @@@ @@г,蠐$unit- ucu|- ucu@@ @@@ +@@@@@ .@@б@г!t- ucu- ucu@@ @@@ =@@г-$unit- ucu- ucu@@ @@@ J@@@@@ M@@B$@@ P- ucup @@@- ucue@,o [iter ~f a] applies function [f] in turn to all the elements of [a]. It is equivalent to [f a.(0); f a.(1); ...; f a.(length a - 1); ()]. -uu-uv.@@@@@@@-@@d%iteri̠-v0v6-v0v;@б!fб@г-#int-v0vA-v0vD@@ @@@ 0--------@|0@A@@б@г-%float-v0vH-v0vM@@ @@@ @@г-[$unit.v0vQ.v0vU@@ @@@ @@@@@ !@@@'@@ $* @@б@г!t.v0vZ.v0v[@@ @@@ 3@@г-}$unit.$v0v_.%v0vc@@ @@@ @@@@@@ C@@V$@@ F.0v0v> @@@.3v0v2@,吠 Same as {!iter}, but the function is applied with the index of the element as first argument, and the element itself as second argument. .?vdvf.@vw@@@@@@@.W@@Z#map͠.Kww .Lww @б!fб@г. %float.Zww.[ww@@ @@@ 0.\.[.[.\.\.\.\.\@w0@A@@г.%float.iww.jww @@ @@@ @@@@@ @@б@г^!t.{ww%.|ww&@@ @@@ !@@гk!t.ww*.ww+@@ @@@ .@@@@@ 1@@D$@@ !4.ww @@@.ww@-I } [map ~f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f]. .w,w..wnw@@@@@@@.@@H$mapiΠ.ww.ww@б!fб@г.h#int.ww.ww@@ @@@ "0........@e~0@A@@б@г.%float.ww.ww@@ @@@ #@@г.%float.ww.ww@@ @@@ $@@@@@ %!@@@'@@ &$* @@б@гԠ!t.ww.ww@@ @@@ '3@@г᠐!t.ww.ww@@ @@@ (@@@@@@ )C@@V$@@ *F/ ww @@@/ ww@- Same as {!map}, but the function is applied to the index of the element as first argument, and the element itself as second argument. /ww/xJx}@@@@@@@/1@@Z)fold_leftϠ/% xx/& xx@б!fб@А!a@ 4G@ +0/2/1/1/2/2/2/2/2@s,@A/8 xx/9 xx@@б@г.%float/C xx/D xx@@ @@@ ,@@А!a/M xx/N xx@@@ !@@ -@@@$@@ .@@б$initА!a,'/] xx/^ xx@@б@гK!t/h xx/i xx@@ @@@ /8@@А!aA</r xx/s xx@@@ F@@ 0A@@"I@@ 1D/z xx@@T+@@ 2H/~ xx @@@/ xx@.3 [fold_left ~f x ~init] computes [f (... (f (f x init.(0)) init.(1)) ...) init.(n-1)], where [n] is the length of the floatarray [init]. /!xx/#yyY@@@@@@@/@@\*fold_rightР/%y[ya/%y[yk@б!fб@г/Z%float/%y[yq/%y[yv@@ @@@ 50////////@y0@A@@б@А!a@ >G@ 6 /%y[yz/%y[y|@@А!a /%y[y/%y[y@@@@@ 7 @@@@@ 8!@@б@г!t/%y[y/%y[y@@ @@@ 9*@@б$initА!a*2/%y[y/%y[y@@А!a08/%y[y/%y[y@@55@@ :=/%y[y@@@@@ ;A@@T+@@ <D/%y[yn @@@/%y[y]@. [fold_right f a init] computes [f a.(0) (f a.(1) ( ... (f a.(n-1) init) ...))], where [n] is the length of the floatarray [a]. 0&yy0(yz-@@@@@@@0@@X0= {2 Iterators on two arrays} 0*z/z10*z/zS@@@@@@000000000@h#@A%iter2Ѡ0,zUz[0,zUz`@б!fб@г/ߠ%float0-,zUzf0.,zUzk@@ @@@ ?@@б@г/%float0<,zUzo0=,zUzt@@ @@@ @-@@г/$unit0I,zUzx0J,zUz|@@ @@@ A:@@@@@ B=@@@%@@ C@( @@б@гA!t0^,zUz0_,zUz@@ @@@ DO@@б@гP!t0m,zUz0n,zUz@@ @@@ E^@@г/Ӡ$unit0z,zUz0{,zUz@@ @@@ Fk@@@@@ Gn@@@%@@ Hq( @@f6@@ It0,zUzc@@@0,zUzW@/> [Array.iter2 ~f a b] applies function [f] to all the elements of [a] and [b]. @raise Invalid_argument if the floatarrays are not the same size. 0-zz0/z{4@@@@@@@0@!@$map2Ҡ01{6{<01{6{@@б!fб@г0e%float01{6{F01{6{K@@ @@@ J000000000@0@A@@б@г0v%float01{6{O01{6{T@@ @@@ K@@г0%float01{6{X01{6{]@@ @@@ L@@@@@ M!@@@'@@ N$* @@б@гɠ!t01{6{b01{6{c@@ @@@ O3@@б@гؠ!t01{6{g01{6{h@@ @@@ PB@@г堐!t11{6{l11{6{m@@ @@@ QO@@@@@ RR@@@%@@ SU( @@h6@@ TX11{6{C@@@11{6{8@/Ɛ  [map2 ~f a b] applies function [f] to all the elements of [a] and [b], and builds a floatarray with the results returned by [f]: [[| f a.(0) b.(0); ...; f a.(length a - 1) b.(length b - 1)|]]. @raise Invalid_argument if the floatarrays are not the same size. 1 2{n{p1!5|A|@@@@@@@18@!@l164 {2 Array scanning} 117||127||@@@@@@0101/1/1010101010@|#@A'for_allӠ1=9||1>9||@б!fб@г0%float1L9||1M9||@@ @@@ U@@г1($bool1Y9||1Z9||@@ @@@ V+@@@@@ W.@@б@г N!t1k9||1l9||@@ @@@ X=@@г1G$bool1x9||1y9||@@ @@@ YJ@@@@@ ZM@@B$@@ [P19|| @@@19||@09 [for_all ~f [|a1; ...; an|]] checks if all elements of the floatarray satisfy the predicate [f]. That is, it returns [(f a1) && (f a2) && ... && (f an)]. 1:||1<}Z}@@@@@@@1@@d&existsԠ1>}}1>}}@б!fб@г1`%float1>}}1>}}@@ @@@ \011111111@|0@A@@г1$bool1>}}1>}}@@ @@@ ]@@@@@ ^@@б@г !t1>}}1>}}@@ @@@ _!@@г1$bool1>}}1>}}@@ @@@ `.@@@@@ a1@@D$@@ b41>}} @@@1>}}@0 [exists f [|a1; ...; an|]] checks if at least one element of the floatarray satisfies the predicate [f]. That is, it returns [(f a1) || (f a2) || ... || (f an)]. 1?}}1A~@~m@@@@@@@2@@H#memՠ2C~o~u2C~o~x@б@г1%float2C~o~{2C~o~@@ @@@ c022222222@az,@A@@б#setг !t2!C~o~2"C~o~@@ @@@ d@@г1$bool2.C~o~2/C~o~@@ @@@ e @@@@ f#27C~o~ @@@*@@ g'- @@@2=C~o~q@0 [mem a ~set] is true if and only if there is an element of [set] that is structurally equal to [a], i.e. there is an [x] in [set] such that [compare a x = 0]. 2ID~~2JF%E@@@@@@@2a@@:(mem_ieee֠2UHGM2VHGU@б@г2%float2`HGX2aHG]@@ @@@ h02b2a2a2b2b2b2b2b@Sh,@A@@б#setг V!t2sHGe2tHGf@@ @@@ i@@г2O$bool2HGj2HGn@@ @@@ j @@@@ k#2HGa @@@*@@ l'- @@@2HGI@1A H Same as {!mem}, but uses IEEE equality instead of structural equality. 2Ioq2Io@@@@@@@2@@:2- {2 Sorting} 2K2K@@@@@@022222222@J_#@A$sortנ2M2M@б#cmpб@г2y%float2M2M@@ @@@ m@@б@г2%float2M2M@@ @@@ n-@@г2#int2M2M@@ @@@ o:@@@@@ p=@@@%@@ q@( @@б@г ۠!t2M2M@@ @@@ rO@@г2^$unit3M3M @@ @@@ s\@@@@@ t_@@T$@@ ub3M @@@3M@1Ɛ | Sort a floatarray in increasing order according to a comparison function. The comparison function must return 0 if its arguments compare as equal, a positive integer if the first is greater, and a negative integer if the first is smaller (see below for a complete specification). For example, {!Stdlib.compare} is a suitable comparison function. After calling [sort], the array is sorted in place in increasing order. [sort] is guaranteed to run in constant heap space and (at most) logarithmic stack space. The current implementation uses Heap Sort. It runs in constant stack space. Specification of the comparison function: Let [a] be the floatarray and [cmp] the comparison function. The following must be true for all [x], [y], [z] in [a] : - [cmp x y] > 0 if and only if [cmp y x] < 0 - if [cmp x y] >= 0 and [cmp y z] >= 0 then [cmp x z] >= 0 When [sort] returns, [a] contains the same elements as before, reordered in such a way that for all i and j valid indices of [a] : - [cmp a.(i) a.(j)] >= 0 if and only if i >= j 3 N 3!d@@@@@@@38@@v+stable_sortؠ3,f3-f@б#cmpб@г2%float3;f3<f@@ @@@ v03=3<3<3=3=3=3=3=@0@A@@б@г2%float3Lf3Mf@@ @@@ w@@г3#int3Yf3Zf@@ @@@ x@@@@@ y!@@@'@@ z$* @@б@г Q!t3nf3of@@ @@@ {3@@г2Ԡ$unit3{f3|f@@ @@@ |@@@@@@ }C@@V$@@ ~F3f @@@3f@2<  Same as {!sort}, but the sorting algorithm is stable (i.e. elements that compare equal are kept in their original order) and not guaranteed to run in constant heap space. The current implementation uses Merge Sort. It uses a temporary floatarray of length [n/2], where [n] is the length of the floatarray. It is usually faster than the current implementation of {!sort}. 3g3m#m@@@@@@@3@@Z)fast_sort٠3oou3oo~@б#cmpб@г3c%float3oo3oo@@ @@@ 033333333@w0@A@@б@г3t%float3oo3oo@@ @@@ @@г3y#int3oo3oo@@ @@@ @@@@@ !@@@'@@ $* @@б@г Ǡ!t3oo3oo@@ @@@ 3@@г3J$unit3oo3oo@@ @@@ @@@@@@ C@@V$@@ F3oo @@@4ooq@2 P Same as {!sort} or {!stable_sort}, whichever is faster on typical input. 4 p4 q@@@@@@@4$@@Z4" {2 Float arrays and Sequences} 4s4s*@@@@@@044444444@j#@A&to_seqڠ4)u,24*u,8@б@г !t44u,;45u,<@@ @@@ @@г3 #Seq!t4Du,F4Eu,K@г4%float4Nu,@4Ou,E@@ @@@ 4@@@@@@ 9 @@@%@@ <(@@@4^u,.@3 Iterate on the floatarray, in increasing order. Modifications of the floatarray during iteration will be reflected in the sequence. 4jvLN4kw@@@@@@@4@)@O'to_seqi۠4vy4wy@б@г d!t4y4y@@ @@@ 044444444@hc,@A@@г3[#Seq!t4y4y@Вг4J#int4y4y@@ @@@ @@г4`%float4y4y@@ @@@ -@@@@@ 2 @@@0@@@ 74y+@@@>@@ ;A.@@@4y1@3v Iterate on the floatarray, in increasing order, yielding indices along elements. Modifications of the floatarray during iteration will be reflected in the sequence. 4z  4|@@@@@@@4@@@N&of_seqܠ4~4~@б@г3#Seq!t4~4~@г4%float4~4~@@ @@@ 044444444@t9@A@@@ @@@  @@г 렐!t5~5 ~@@ @@@ @@@@@ @@@5~ @3Ő % Create an array from the generator. 55 @@@@@@@57@@*,map_to_arrayݠ5+5,%@б!fб@г4점%float5:+5;0@@ @@@ 05<5;5;5<5<5<5<5<@Gi0@A@@А!a@ G@  5K45L6@@@ @@ @@б@г %array5fC5gH@А!a'-5m@5nB@@@-@@@ 4 @@@@@ 7@@J,@@ :5z(@@@5}@4/ [map_to_array ~f a] applies function [f] to all the elements of [a], and builds an array with the results returned by [f]: [[| f a.(0); f a.(1); ...; f a.(length a - 1) |]]. 5IK5 @@@@@@@5@&@N.map_from_arrayޠ5 5 !@б!fб@А!a@ G@ 055555555@g,@A5 '5 )@@г5c%float5 -5 2@@ @@@ @@@@@ @@б@г5%array5 :5 ?@А!a)$5 75 9@@@/@@@ + @@г !t5 C5 D@@ @@@ 8@@@@@ ;@@J,@@ >5 $ @@@5 @4 [map_from_array ~f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f]. 5EG5@@@@@@@6 @@R6 "/*66@@@@@@066666666@bw#@A6< {2 Undocumented functions} 66@@@@@@*unsafe_getߠ6MX6 Mb@б@г !t6*Me6+Mf@@ @@@ )@@б@г5㠐#int69Mj6:Mm@@ @@@ 8@@г5%float6FMq6GMv@@ @@@ E@@@@@ H@@@%@@ K( @@6%floatarray_unsafe_getBA4q@@@@6YMO6ZM@@6q@@@X*unsafe_set6f6g@б@гT!t6q6r@@ @@@ 06s6r6r6s6s6s6s6s@q]&@A@@б@г6,#int66@@ @@@ @@б@г6C%float66@@ @@@  @@г5$unit66@@ @@@ -@@@@@ 0@@@%@@ 3( @@@9@@ 6<@@6%floatarray_unsafe_setCA4̠@@@@@66@@6 @@@D@A@! @  @  N@ : @  @  d@ P @  @  h@ T -@  @  $@  @  @ k @ @I@5@c@O@\@H@e@Q@@c@>@l@X@@8@$@@o@@W@@077777777@Y@AM077777777@@A7 gh7 @@5 > Float arrays with packed representation (labeled functions). 77'@@@@@@@7gg@@@55@55@55}@5i5B@5'4@44@44F@4+3@33@3Y3 @22@22@2x2Q@272"@21@11@11@11~@1j1U@1A1,@10@00@00{@0g0@@0,0@//@//@/i/3@/.@..A@.-@--@-Z-3@-,@,,@,R,+@++@++{@+J+#@**@**s@*B*@))@))k@):)@((@((c@(2'@''@'\'5@'&@&&@&T&-@%%@%%}@%L%%@$$@$$u@$D$@##@##[@#)"@""@"e"(@"!@!!M@!2!,A@  @  w@ c *@ @z@f-@@}@iB@-@)@@@7@@@077777777@|@A@%@@R@>@  @  h@ T @  @  l@ X 1@  @  (@  @  @ o #@  @  M@ 9@g@S@`@L@i@U@@g@B@p@\@@<@(@@s@@[@@O@A@ H************************************************************************8 A@@8 A@L@ H 8BMM8BM@ H OCaml 8C8C@ H 8D8D3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt 8$E448%E4@ H Nicolas Ojeda Bar, LexiFi 8*F8+F@ H 80G81G@ H Copyright 2018 Institut National de Recherche en Informatique et 86H87Hg@ H en Automatique. 8* Floating-point subtraction. 5ݠ !* Floating-point multiplication. 5;* Floating-point division. 57 * [fma x y z] returns [x * y + z], with a best effort for computing this expression with a single rounding, using either hardware instructions (providing full IEEE compliance) or a software emulation. On 64-bit Cygwin, 64-bit mingw-w64 and MSVC 2017 and earlier, this function may be emulated owing to known bugs on limitations on these platforms. Note: since software emulation of the fma is costly, make sure that you are using hardware fma support if performance matters. @since 4.08.0 4 * [rem a b] returns the remainder of [a] with respect to [b]. The returned value is [a -. n *. b], where [n] is the quotient [a /. b] rounded towards zero to an integer. 4Q * [succ x] returns the floating point number right after [x] i.e., the smallest floating-point number greater than [x]. See also {!next_after}. @since 4.08.0 4 * [pred x] returns the floating-point number right before [x] i.e., the greatest floating-point number smaller than [x]. See also {!next_after}. @since 4.08.0 3۠ -* [abs f] returns the absolute value of [f]. 35* Positive infinity. 3s5* Negative infinity. 3K w* A special floating-point value denoting the result of an undefined operation such as [0.0 /. 0.0]. Stands for 'not a number'. Any floating-point operation with [nan] as argument returns [nan] as result. As for floating-point comparisons, [=], [<], [<=], [>] and [>=] return [false] and [<>] returns [true] if one or both of their arguments is [nan]. 3#3* The constant pi. 2 5* The largest positive finite value of type [float]. 2Ӡ K* The smallest positive, non-zero, non-denormalized value of type [float]. 2 t* The difference between [1.0] and the smallest exactly representable floating-point number greater than [1.0]. 2 o* [is_finite x] is [true] if and only if [x] is finite i.e., not infinite and not {!nan}. @since 4.08.0 2I h* [is_infinite x] is [true] if and only if [x] is {!infinity} or {!neg_infinity}. @since 4.08.0 2 Z* [is_nan x] is [true] if and only if [x] is not a number (see {!nan}). @since 4.08.0 1ՠ O* [is_integer x] is [true] if and only if [x] is an integer. @since 4.08.0 1 (* Convert an integer to floating-point. 1\ * Truncate the given floating-point number to an integer. The result is unspecified if the argument is [nan] or falls outside the range of representable integers. 1 _* Convert the given string to a float. The string is read in decimal (by default) or in hexadecimal (marked by [0x] or [0X]). The format of decimal floating-point numbers is [ [-] dd.ddd (e|E) [+|-] dd ], where [d] stands for a decimal digit. The format of hexadecimal floating-point numbers is [ [-] 0(x|X) hh.hhh (p|P) [+|-] dd ], where [h] stands for an hexadecimal digit and [d] for a decimal digit. In both cases, at least one of the integer and fractional parts must be given; the exponent part is optional. The [_] (underscore) character can appear anywhere in the string and is ignored. Depending on the execution platforms, other representations of floating-point numbers can be accepted, but should not be relied upon. @raise Failure if the given string is not a valid representation of a float. 0ܠ >* Same as [of_string], but returns [None] instead of raising. 0 * Return a string representation of a floating-point number. This conversion can involve a loss of precision. For greater control over the manner in which the number is printed, see {!Printf}. This function is an alias for {!Stdlib.string_of_float}. 0X #* Normal number, none of the below 07 2* Number very close to 0.0, has reduced precision 0$8* Number is 0.0 or -0.0 0 ** Number is positive or negative infinity / 1* Not a number: result of an undefined operation /렠 c* The five classes of floating-point numbers, as determined by the {!classify_float} function. /נ o* Return the class of the given floating-point number: normal, subnormal, zero, infinite, or not a number. /L2* Exponentiation. .⠠/* Square root. . * Cube root. @since 4.13.0 .4/* Exponential. -ݠ 2* Base 2 exponential function. @since 4.13.0 -5* Natural logarithm. -/5* Base 10 logarithm. ,ؠ '* Base 2 logarithm. @since 4.13.0 , l* [expm1 x] computes [exp x -. 1.0], giving numerically-accurate results even if [x] is close to [0.0]. ,* * [log1p x] computes [log(1.0 +. x)] (natural logarithm), giving numerically-accurate results even if [x] is close to [0.0]. +Ӡ #* Cosine. Argument is in radians. +| !* Sine. Argument is in radians. +% $* Tangent. Argument is in radians. *Π ~* Arc cosine. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and is between [0.0] and [pi]. *w * Arc sine. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and is between [-pi/2] and [pi/2]. * K* Arc tangent. Result is in radians and is between [-pi/2] and [pi/2]. )ɠ * [atan2 y x] returns the arc tangent of [y /. x]. The signs of [x] and [y] are used to determine the quadrant of the result. Result is in radians and is between [-pi] and [pi]. )_ 3* [hypot x y] returns [sqrt(x *. x + y *. y)], that is, the length of the hypotenuse of a right-angled triangle with sides of length [x] and [y], or, equivalently, the distance of the point [(x,y)] to origin. If one of [x] or [y] is infinite, returns [infinity] even if the other is [nan]. ( .* Hyperbolic cosine. Argument is in radians. ( /* Hyperbolic tangent. Argument is in radians. (G * Hyperbolic arc cosine. The argument must fall within the range [[1.0, inf]]. Result is in radians and is between [0.0] and [inf]. @since 4.13.0 ' * Hyperbolic arc sine. The argument and result range over the entire real line. Result is in radians. @since 4.13.0 ' * Hyperbolic arc tangent. The argument must fall within the range [[-1.0, 1.0]]. Result is in radians and ranges over the entire real line. @since 4.13.0 'B * Error function. The argument ranges over the entire real line. The result is always within [[-1.0, 1.0]]. @since 4.13.0 &렠 * Complementary error function ([erfc x = 1 - erf x]). The argument ranges over the entire real line. The result is always within [[-1.0, 1.0]]. @since 4.13.0 & v* [trunc x] rounds [x] to the nearest integer whose absolute value is less than or equal to [x]. @since 4.08.0 &= * [round x] rounds [x] to the nearest integer with ties (fractional values of 0.5) rounded away from zero, regardless of the current rounding direction. If [x] is an integer, [+0.], [-0.], [nan], or infinite, [x] itself is returned. On 64-bit mingw-w64, this function may be emulated owing to a bug in the C runtime library (CRT) on this platform. @since 4.08.0 %栠 * Round above to an integer value. [ceil f] returns the least integer value greater than or equal to [f]. The result is returned as a float. % * Round below to an integer value. [floor f] returns the greatest integer value less than or equal to [f]. The result is returned as a float. %8 ]* [next_after x y] returns the next representable floating-point value following [x] in the direction of [y]. More precisely, if [y] is greater (resp. less) than [x], it returns the smallest (resp. largest) representable number greater (resp. less) than [x]. If [x] equals [y], the function returns [y]. If [x] or [y] is [nan], a [nan] is returned. Note that [next_after max_float infinity = infinity] and that [next_after 0. infinity] is the smallest denormalized positive number. If [x] is the smallest denormalized positive number, [next_after x 0. = 0.] @since 4.08.0 $Π * [copy_sign x y] returns a float whose absolute value is that of [x] and whose sign is that of [y]. If [x] is [nan], returns [nan]. If [y] is [nan], returns either [x] or [-. x], but it is not specified which. $d * [sign_bit x] is [true] if and only if the sign bit of [x] is set. For example [sign_bit 1.] and [signbit 0.] are [false] while [sign_bit (-1.)] and [sign_bit (-0.)] are [true]. @since 4.08.0 $ * [frexp f] returns the pair of the significant and the exponent of [f]. When [f] is zero, the significant [x] and the exponent [n] of [f] are equal to zero. When [f] is non-zero, they are defined by [f = x *. 2 ** n] and [0.5 <= x < 1.0]. # %* [ldexp x n] returns [x *. 2 ** n]. #3 L* [modf f] returns the pair of the fractional and integral part of [f]. "ܠ 3* An alias for the type of floating-point numbers. " F* [compare x y] returns [0] if [x] is equal to [y], a negative integer if [x] is less than [y], and a positive integer if [x] is greater than [y]. [compare] treats [nan] as equal to itself and less than any other float value. This treatment of [nan] ensures that [compare] defines a total ordering relation. "Z L* The equal function for floating-point numbers, compared using {!compare}. " * [min x y] returns the minimum of [x] and [y]. It returns [nan] when [x] or [y] is [nan]. Moreover [min (-0.) (+0.) = -0.] @since 4.08.0 !  * [max x y] returns the maximum of [x] and [y]. It returns [nan] when [x] or [y] is [nan]. Moreover [max (-0.) (+0.) = +0.] @since 4.08.0 !v P* [min_max x y] is [(min x y, max x y)], just more efficient. @since 4.08.0 ! * [min_num x y] returns the minimum of [x] and [y] treating [nan] as missing values. If both [x] and [y] are [nan], [nan] is returned. Moreover [min_num (-0.) (+0.) = -0.] @since 4.08.0  Ƞ * [max_num x y] returns the maximum of [x] and [y] treating [nan] as missing values. If both [x] and [y] are [nan] [nan] is returned. Moreover [max_num (-0.) (+0.) = +0.] @since 4.08.0  | * [min_max_num x y] is [(min_num x y, max_num x y)], just more efficient. Note that in particular [min_max_num x nan = (x, x)] and [min_max_num nan y = (y, y)]. @since 4.08.0   0* The hash function for floating-point numbers. ࠠ O* The type of float arrays with packed representation. @since 4.08.0  B* Return the length (number of elements) of the given floatarray. b * [get a n] returns the element number [n] of floatarray [a]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)].  * [set a n x] modifies floatarray [a] in place, replacing element number [n] with [x]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)].  * [make n x] returns a fresh floatarray of length [n], initialized with [x]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. l * [create n] returns a fresh floatarray of length [n], with uninitialized data. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. 2 0* [init n f] returns a fresh floatarray of length [n], with element number [i] initialized to the result of [f i]. In other terms, [init n f] tabulates the results of [f] applied to the integers [0] to [n-1]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. Ӡ * [append v1 v2] returns a fresh floatarray containing the concatenation of the floatarrays [v1] and [v2]. @raise Invalid_argument if [length v1 + length v2 > Sys.max_floatarray_length].  =* Same as {!append}, but concatenates a list of floatarrays. > <* [sub a pos len] returns a fresh floatarray of length [len], containing the elements number [pos] to [pos + len - 1] of floatarray [a]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a]; that is, if [pos < 0], or [len < 0], or [pos + len > length a]. ࠠ i* [copy a] returns a copy of [a], that is, a fresh floatarray containing the same elements as [a].  * [fill a pos len x] modifies the floatarray [a] in place, storing [x] in elements number [pos] to [pos + len - 1]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a]. 6 * [blit src src_pos dst dst_pos len] copies [len] elements from floatarray [src], starting at element number [src_pos], to floatarray [dst], starting at element number [dst_pos]. It works correctly even if [src] and [dst] are the same floatarray, and the source and destination chunks overlap. @raise Invalid_argument if [src_pos] and [len] do not designate a valid subarray of [src], or if [dst_pos] and [len] do not designate a valid subarray of [dst].  ;* [to_list a] returns the list of all the elements of [a]. k * [of_list l] returns a fresh floatarray containing the elements of [l]. @raise Invalid_argument if the length of [l] is greater than [Sys.max_floatarray_length]."0* {2 Iterators}  * [iter f a] applies function [f] in turn to all the elements of [a]. It is equivalent to [f a.(0); f a.(1); ...; f a.(length a - 1); ()].  * Same as {!iter}, but the function is applied with the index of the element as first argument, and the element itself as second argument. F }* [map f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f]. 砠 * Same as {!map}, but the function is applied to the index of the element as first argument, and the element itself as second argument. v * [fold_left f x init] computes [f (... (f (f x init.(0)) init.(1)) ...) init.(n-1)], where [n] is the length of the floatarray [init].  * [fold_right f a init] computes [f a.(0) (f a.(1) ( ... (f a.(n-1) init) ...))], where [n] is the length of the floatarray [a]. >* {2 Iterators on two arrays}  * [Array.iter2 f a b] applies function [f] to all the elements of [a] and [b]. @raise Invalid_argument if the floatarrays are not the same size.  * [map2 f a b] applies function [f] to all the elements of [a] and [b], and builds a floatarray with the results returned by [f]: [[| f a.(0) b.(0); ...; f a.(length a - 1) b.(length b - 1)|]]. @raise Invalid_argument if the floatarrays are not the same size. 5* {2 Array scanning} ~ * [for_all f [|a1; ...; an|]] checks if all elements of the floatarray satisfy the predicate [f]. That is, it returns [(f a1) && (f a2) && ... && (f an)]. ! * [exists f [|a1; ...; an|]] checks if at least one element of the floatarray satisfies the predicate [f]. That is, it returns [(f a1) || (f a2) || ... || (f an)].   * [mem a set] is true if and only if there is an element of [set] that is structurally equal to [a], i.e. there is an [x] in [set] such that [compare a x = 0]. v I* Same as {!mem}, but uses IEEE equality instead of structural equality. *.* {2 Sorting}  }* Sort a floatarray in increasing order according to a comparison function. The comparison function must return 0 if its arguments compare as equal, a positive integer if the first is greater, and a negative integer if the first is smaller (see below for a complete specification). For example, {!Stdlib.compare} is a suitable comparison function. After calling [sort], the array is sorted in place in increasing order. [sort] is guaranteed to run in constant heap space and (at most) logarithmic stack space. The current implementation uses Heap Sort. It runs in constant stack space. Specification of the comparison function: Let [a] be the floatarray and [cmp] the comparison function. The following must be true for all [x], [y], [z] in [a] : - [cmp x y] > 0 if and only if [cmp y x] < 0 - if [cmp x y] >= 0 and [cmp y z] >= 0 then [cmp x z] >= 0 When [sort] returns, [a] contains the same elements as before, reordered in such a way that for all i and j valid indices of [a] : - [cmp a.(i) a.(j)] >= 0 if and only if i >= j  * Same as {!sort}, but the sorting algorithm is stable (i.e. elements that compare equal are kept in their original order) and not guaranteed to run in constant heap space. The current implementation uses Merge Sort. It uses a temporary floatarray of length [n/2], where [n] is the length of the floatarray. It is usually faster than the current implementation of {!sort}. < Q* Same as {!sort} or {!stable_sort}, whichever is faster on typical input. ˠ !* {2 Float arrays and Sequences}  * Iterate on the floatarray, in increasing order. Modifications of the floatarray during iteration will be reflected in the sequence. s * Iterate on the floatarray, in increasing order, yielding indices along elements. Modifications of the floatarray during iteration will be reflected in the sequence.  &* Create an array from the generator. Ġ * [map_to_array f a] applies function [f] to all the elements of [a], and builds an array with the results returned by [f]: [[| f a.(0); f a.(1); ...; f a.(length a - 1) |]]. _ * [map_from_array f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f]. #*/*젠=* {2 Undocumented functions} ޠ @ These functions are for system use only. Do not call directly. 9ff9fg&@ +* Float arrays with packed representation. 栠 O* The type of float arrays with packed representation. @since 4.08.0  B* Return the length (number of elements) of the given floatarray.  * [get a n] returns the element number [n] of floatarray [a]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)]. Π * [set a n x] modifies floatarray [a] in place, replacing element number [n] with [x]. @raise Invalid_argument if [n] is outside the range 0 to [(length a - 1)]. p * [make n x] returns a fresh floatarray of length [n], initialized with [x]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. $ * [create n] returns a fresh floatarray of length [n], with uninitialized data. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length]. ꠠ 2* [init n ~f] returns a fresh floatarray of length [n], with element number [i] initialized to the result of [f i]. In other terms, [init n ~f] tabulates the results of [f] applied to the integers [0] to [n-1]. @raise Invalid_argument if [n < 0] or [n > Sys.max_floatarray_length].  * [append v1 v2] returns a fresh floatarray containing the concatenation of the floatarrays [v1] and [v2]. @raise Invalid_argument if [length v1 + length v2 > Sys.max_floatarray_length]. = =* Same as {!append}, but concatenates a list of floatarrays.  >* [sub a ~pos ~len] returns a fresh floatarray of length [len], containing the elements number [pos] to [pos + len - 1] of floatarray [a]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a]; that is, if [pos < 0], or [len < 0], or [pos + len > length a].  i* [copy a] returns a copy of [a], that is, a fresh floatarray containing the same elements as [a]. V * [fill a ~pos ~len x] modifies the floatarray [a] in place, storing [x] in elements number [pos] to [pos + len - 1]. @raise Invalid_argument if [pos] and [len] do not designate a valid subarray of [a].  ࠠ * [blit ~src ~src_pos ~dst ~dst_pos ~len] copies [len] elements from floatarray [src], starting at element number [src_pos], to floatarray [dst], starting at element number [dst_pos]. It works correctly even if [src] and [dst] are the same floatarray, and the source and destination chunks overlap. @raise Invalid_argument if [src_pos] and [len] do not designate a valid subarray of [src], or if [dst_pos] and [len] do not designate a valid subarray of [dst].  O ;* [to_list a] returns the list of all the elements of [a].   * [of_list l] returns a fresh floatarray containing the elements of [l]. @raise Invalid_argument if the length of [l] is greater than [Sys.max_floatarray_length]. 0* {2 Iterators}  * [iter ~f a] applies function [f] in turn to all the elements of [a]. It is equivalent to [f a.(0); f a.(1); ...; f a.(length a - 1); ()].  P * Same as {!iter}, but the function is applied with the index of the element as first argument, and the element itself as second argument.  ݠ ~* [map ~f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f].  | * Same as {!map}, but the function is applied to the index of the element as first argument, and the element itself as second argument.  * [fold_left ~f x ~init] computes [f (... (f (f x init.(0)) init.(1)) ...) init.(n-1)], where [n] is the length of the floatarray [init].  * [fold_right f a init] computes [f a.(0) (f a.(1) ( ... (f a.(n-1) init) ...))], where [n] is the length of the floatarray [a].  '>* {2 Iterators on two arrays}   * [Array.iter2 ~f a b] applies function [f] to all the elements of [a] and [b]. @raise Invalid_argument if the floatarrays are not the same size.  * [map2 ~f a b] applies function [f] to all the elements of [a] and [b], and builds a floatarray with the results returned by [f]: [[| f a.(0) b.(0); ...; f a.(length a - 1) b.(length b - 1)|]]. @raise Invalid_argument if the floatarrays are not the same size.  5* {2 Array scanning}   * [for_all ~f [|a1; ...; an|]] checks if all elements of the floatarray satisfy the predicate [f]. That is, it returns [(f a1) && (f a2) && ... && (f an)].  * [exists f [|a1; ...; an|]] checks if at least one element of the floatarray satisfies the predicate [f]. That is, it returns [(f a1) || (f a2) || ... || (f an)]. C * [mem a ~set] is true if and only if there is an element of [set] that is structurally equal to [a], i.e. there is an [x] in [set] such that [compare a x = 0].  I* Same as {!mem}, but uses IEEE equality instead of structural equality. .* {2 Sorting}  }* Sort a floatarray in increasing order according to a comparison function. The comparison function must return 0 if its arguments compare as equal, a positive integer if the first is greater, and a negative integer if the first is smaller (see below for a complete specification). For example, {!Stdlib.compare} is a suitable comparison function. After calling [sort], the array is sorted in place in increasing order. [sort] is guaranteed to run in constant heap space and (at most) logarithmic stack space. The current implementation uses Heap Sort. It runs in constant stack space. Specification of the comparison function: Let [a] be the floatarray and [cmp] the comparison function. The following must be true for all [x], [y], [z] in [a] : - [cmp x y] > 0 if and only if [cmp y x] < 0 - if [cmp x y] >= 0 and [cmp y z] >= 0 then [cmp x z] >= 0 When [sort] returns, [a] contains the same elements as before, reordered in such a way that for all i and j valid indices of [a] : - [cmp a.(i) a.(j)] >= 0 if and only if i >= j & * Same as {!sort}, but the sorting algorithm is stable (i.e. elements that compare equal are kept in their original order) and not guaranteed to run in constant heap space. The current implementation uses Merge Sort. It uses a temporary floatarray of length [n/2], where [n] is the length of the floatarray. It is usually faster than the current implementation of {!sort}.  Q* Same as {!sort} or {!stable_sort}, whichever is faster on typical input. @ !* {2 Float arrays and Sequences} 2 * Iterate on the floatarray, in increasing order. Modifications of the floatarray during iteration will be reflected in the sequence. 蠠 * Iterate on the floatarray, in increasing order, yielding indices along elements. Modifications of the floatarray during iteration will be reflected in the sequence.  &* Create an array from the generator. 9 * [map_to_array ~f a] applies function [f] to all the elements of [a], and builds an array with the results returned by [f]: [[| f a.(0); f a.(1); ...; f a.(length a - 1) |]]. Ҡ * [map_from_array ~f a] applies function [f] to all the elements of [a], and builds a floatarray with the results returned by [f]. k#*/*]=* {2 Undocumented functions} O @ These functions are for system use only. Do not call directly. :g:hL@ ?* Float arrays with packed representation (labeled functions). W@D)../ocamlc0-strict-sequence(-absname"-w8+a-4-9-41-42-44-45-48-70"-g+-warn-error"+A*-bin-annot)-nostdlib*-principal,-safe-string/-strict-formats"-o1stdlib__Float.cmi"-c:|:} 1/home/barsac/ci/builds/workspace/bootstrap/stdlib @04x}AX ҍ,zlh0::::::::@:~@@8CamlinternalFormatBasics0cEXy,W:(.Stdlib__Either0 }rCT0J){9):0׮[eH-n;ɠ+Stdlib__Seq0yt\eǟ&Q,}@0׮[eH-n;A@@ I H//@ O N@fe@@@zy'',,-*-'@4455@@@)(##@!.!-(y(v).)+@  @@4O4N@,+#(#'@@?>@1)1&@((ذ22@@@66@@,,.L.I77@@@%%88@  3"3 @@  @@++@++@ 7 60r0o@@nm##$?$O6Q6P@  @.-@@@@@@@/.,,@4443@@  @Ѱ!!@$$ɰ(I(F88@* * @33~@@,+@""@@ H GRQ0066@8C8A@@*r*o@IH!!77@@**Ͱ9c9b@PO@0@0=@/4/1@%k%i@@33@ @ ?44@@@//@@@7+7(@@@m&(&%@gf..@!L!\9L9K@@@@ \ [@KI0/@kj@''@|{@  VU@#.#-@@zy@98@@+`+]@''22@@@@5B5A@33@UT@  @&&@55@԰""@KJ@@,+4455@h @  @(9(6@QP@@@@@hg  . .55@@6866@$$ɰ99@&%@@* * 22@@@P@