| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807 | 
							- <?php
 
- namespace PhpOffice\PhpSpreadsheet\Calculation;
 
- use Complex\Complex;
 
- use Complex\Exception as ComplexException;
 
- class Engineering
 
- {
 
-     /**
 
-      * EULER.
 
-      */
 
-     const EULER = 2.71828182845904523536;
 
-     /**
 
-      * Details of the Units of measure that can be used in CONVERTUOM().
 
-      *
 
-      * @var mixed[]
 
-      */
 
-     private static $conversionUnits = [
 
-         'g' => ['Group' => 'Mass', 'Unit Name' => 'Gram', 'AllowPrefix' => true],
 
-         'sg' => ['Group' => 'Mass', 'Unit Name' => 'Slug', 'AllowPrefix' => false],
 
-         'lbm' => ['Group' => 'Mass', 'Unit Name' => 'Pound mass (avoirdupois)', 'AllowPrefix' => false],
 
-         'u' => ['Group' => 'Mass', 'Unit Name' => 'U (atomic mass unit)', 'AllowPrefix' => true],
 
-         'ozm' => ['Group' => 'Mass', 'Unit Name' => 'Ounce mass (avoirdupois)', 'AllowPrefix' => false],
 
-         'm' => ['Group' => 'Distance', 'Unit Name' => 'Meter', 'AllowPrefix' => true],
 
-         'mi' => ['Group' => 'Distance', 'Unit Name' => 'Statute mile', 'AllowPrefix' => false],
 
-         'Nmi' => ['Group' => 'Distance', 'Unit Name' => 'Nautical mile', 'AllowPrefix' => false],
 
-         'in' => ['Group' => 'Distance', 'Unit Name' => 'Inch', 'AllowPrefix' => false],
 
-         'ft' => ['Group' => 'Distance', 'Unit Name' => 'Foot', 'AllowPrefix' => false],
 
-         'yd' => ['Group' => 'Distance', 'Unit Name' => 'Yard', 'AllowPrefix' => false],
 
-         'ang' => ['Group' => 'Distance', 'Unit Name' => 'Angstrom', 'AllowPrefix' => true],
 
-         'Pica' => ['Group' => 'Distance', 'Unit Name' => 'Pica (1/72 in)', 'AllowPrefix' => false],
 
-         'yr' => ['Group' => 'Time', 'Unit Name' => 'Year', 'AllowPrefix' => false],
 
-         'day' => ['Group' => 'Time', 'Unit Name' => 'Day', 'AllowPrefix' => false],
 
-         'hr' => ['Group' => 'Time', 'Unit Name' => 'Hour', 'AllowPrefix' => false],
 
-         'mn' => ['Group' => 'Time', 'Unit Name' => 'Minute', 'AllowPrefix' => false],
 
-         'sec' => ['Group' => 'Time', 'Unit Name' => 'Second', 'AllowPrefix' => true],
 
-         'Pa' => ['Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => true],
 
-         'p' => ['Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => true],
 
-         'atm' => ['Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => true],
 
-         'at' => ['Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => true],
 
-         'mmHg' => ['Group' => 'Pressure', 'Unit Name' => 'mm of Mercury', 'AllowPrefix' => true],
 
-         'N' => ['Group' => 'Force', 'Unit Name' => 'Newton', 'AllowPrefix' => true],
 
-         'dyn' => ['Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => true],
 
-         'dy' => ['Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => true],
 
-         'lbf' => ['Group' => 'Force', 'Unit Name' => 'Pound force', 'AllowPrefix' => false],
 
-         'J' => ['Group' => 'Energy', 'Unit Name' => 'Joule', 'AllowPrefix' => true],
 
-         'e' => ['Group' => 'Energy', 'Unit Name' => 'Erg', 'AllowPrefix' => true],
 
-         'c' => ['Group' => 'Energy', 'Unit Name' => 'Thermodynamic calorie', 'AllowPrefix' => true],
 
-         'cal' => ['Group' => 'Energy', 'Unit Name' => 'IT calorie', 'AllowPrefix' => true],
 
-         'eV' => ['Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => true],
 
-         'ev' => ['Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => true],
 
-         'HPh' => ['Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => false],
 
-         'hh' => ['Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => false],
 
-         'Wh' => ['Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => true],
 
-         'wh' => ['Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => true],
 
-         'flb' => ['Group' => 'Energy', 'Unit Name' => 'Foot-pound', 'AllowPrefix' => false],
 
-         'BTU' => ['Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => false],
 
-         'btu' => ['Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => false],
 
-         'HP' => ['Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => false],
 
-         'h' => ['Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => false],
 
-         'W' => ['Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => true],
 
-         'w' => ['Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => true],
 
-         'T' => ['Group' => 'Magnetism', 'Unit Name' => 'Tesla', 'AllowPrefix' => true],
 
-         'ga' => ['Group' => 'Magnetism', 'Unit Name' => 'Gauss', 'AllowPrefix' => true],
 
-         'C' => ['Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => false],
 
-         'cel' => ['Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => false],
 
-         'F' => ['Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => false],
 
-         'fah' => ['Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => false],
 
-         'K' => ['Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => false],
 
-         'kel' => ['Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => false],
 
-         'tsp' => ['Group' => 'Liquid', 'Unit Name' => 'Teaspoon', 'AllowPrefix' => false],
 
-         'tbs' => ['Group' => 'Liquid', 'Unit Name' => 'Tablespoon', 'AllowPrefix' => false],
 
-         'oz' => ['Group' => 'Liquid', 'Unit Name' => 'Fluid Ounce', 'AllowPrefix' => false],
 
-         'cup' => ['Group' => 'Liquid', 'Unit Name' => 'Cup', 'AllowPrefix' => false],
 
-         'pt' => ['Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => false],
 
-         'us_pt' => ['Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => false],
 
-         'uk_pt' => ['Group' => 'Liquid', 'Unit Name' => 'U.K. Pint', 'AllowPrefix' => false],
 
-         'qt' => ['Group' => 'Liquid', 'Unit Name' => 'Quart', 'AllowPrefix' => false],
 
-         'gal' => ['Group' => 'Liquid', 'Unit Name' => 'Gallon', 'AllowPrefix' => false],
 
-         'l' => ['Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => true],
 
-         'lt' => ['Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => true],
 
-     ];
 
-     /**
 
-      * Details of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM().
 
-      *
 
-      * @var mixed[]
 
-      */
 
-     private static $conversionMultipliers = [
 
-         'Y' => ['multiplier' => 1E24, 'name' => 'yotta'],
 
-         'Z' => ['multiplier' => 1E21, 'name' => 'zetta'],
 
-         'E' => ['multiplier' => 1E18, 'name' => 'exa'],
 
-         'P' => ['multiplier' => 1E15, 'name' => 'peta'],
 
-         'T' => ['multiplier' => 1E12, 'name' => 'tera'],
 
-         'G' => ['multiplier' => 1E9, 'name' => 'giga'],
 
-         'M' => ['multiplier' => 1E6, 'name' => 'mega'],
 
-         'k' => ['multiplier' => 1E3, 'name' => 'kilo'],
 
-         'h' => ['multiplier' => 1E2, 'name' => 'hecto'],
 
-         'e' => ['multiplier' => 1E1, 'name' => 'deka'],
 
-         'd' => ['multiplier' => 1E-1, 'name' => 'deci'],
 
-         'c' => ['multiplier' => 1E-2, 'name' => 'centi'],
 
-         'm' => ['multiplier' => 1E-3, 'name' => 'milli'],
 
-         'u' => ['multiplier' => 1E-6, 'name' => 'micro'],
 
-         'n' => ['multiplier' => 1E-9, 'name' => 'nano'],
 
-         'p' => ['multiplier' => 1E-12, 'name' => 'pico'],
 
-         'f' => ['multiplier' => 1E-15, 'name' => 'femto'],
 
-         'a' => ['multiplier' => 1E-18, 'name' => 'atto'],
 
-         'z' => ['multiplier' => 1E-21, 'name' => 'zepto'],
 
-         'y' => ['multiplier' => 1E-24, 'name' => 'yocto'],
 
-     ];
 
-     /**
 
-      * Details of the Units of measure conversion factors, organised by group.
 
-      *
 
-      * @var mixed[]
 
-      */
 
-     private static $unitConversions = [
 
-         'Mass' => [
 
-             'g' => [
 
-                 'g' => 1.0,
 
-                 'sg' => 6.85220500053478E-05,
 
-                 'lbm' => 2.20462291469134E-03,
 
-                 'u' => 6.02217000000000E+23,
 
-                 'ozm' => 3.52739718003627E-02,
 
-             ],
 
-             'sg' => [
 
-                 'g' => 1.45938424189287E+04,
 
-                 'sg' => 1.0,
 
-                 'lbm' => 3.21739194101647E+01,
 
-                 'u' => 8.78866000000000E+27,
 
-                 'ozm' => 5.14782785944229E+02,
 
-             ],
 
-             'lbm' => [
 
-                 'g' => 4.5359230974881148E+02,
 
-                 'sg' => 3.10810749306493E-02,
 
-                 'lbm' => 1.0,
 
-                 'u' => 2.73161000000000E+26,
 
-                 'ozm' => 1.60000023429410E+01,
 
-             ],
 
-             'u' => [
 
-                 'g' => 1.66053100460465E-24,
 
-                 'sg' => 1.13782988532950E-28,
 
-                 'lbm' => 3.66084470330684E-27,
 
-                 'u' => 1.0,
 
-                 'ozm' => 5.85735238300524E-26,
 
-             ],
 
-             'ozm' => [
 
-                 'g' => 2.83495152079732E+01,
 
-                 'sg' => 1.94256689870811E-03,
 
-                 'lbm' => 6.24999908478882E-02,
 
-                 'u' => 1.70725600000000E+25,
 
-                 'ozm' => 1.0,
 
-             ],
 
-         ],
 
-         'Distance' => [
 
-             'm' => [
 
-                 'm' => 1.0,
 
-                 'mi' => 6.21371192237334E-04,
 
-                 'Nmi' => 5.39956803455724E-04,
 
-                 'in' => 3.93700787401575E+01,
 
-                 'ft' => 3.28083989501312E+00,
 
-                 'yd' => 1.09361329797891E+00,
 
-                 'ang' => 1.00000000000000E+10,
 
-                 'Pica' => 2.83464566929116E+03,
 
-             ],
 
-             'mi' => [
 
-                 'm' => 1.60934400000000E+03,
 
-                 'mi' => 1.0,
 
-                 'Nmi' => 8.68976241900648E-01,
 
-                 'in' => 6.33600000000000E+04,
 
-                 'ft' => 5.28000000000000E+03,
 
-                 'yd' => 1.76000000000000E+03,
 
-                 'ang' => 1.60934400000000E+13,
 
-                 'Pica' => 4.56191999999971E+06,
 
-             ],
 
-             'Nmi' => [
 
-                 'm' => 1.85200000000000E+03,
 
-                 'mi' => 1.15077944802354E+00,
 
-                 'Nmi' => 1.0,
 
-                 'in' => 7.29133858267717E+04,
 
-                 'ft' => 6.07611548556430E+03,
 
-                 'yd' => 2.02537182785694E+03,
 
-                 'ang' => 1.85200000000000E+13,
 
-                 'Pica' => 5.24976377952723E+06,
 
-             ],
 
-             'in' => [
 
-                 'm' => 2.54000000000000E-02,
 
-                 'mi' => 1.57828282828283E-05,
 
-                 'Nmi' => 1.37149028077754E-05,
 
-                 'in' => 1.0,
 
-                 'ft' => 8.33333333333333E-02,
 
-                 'yd' => 2.77777777686643E-02,
 
-                 'ang' => 2.54000000000000E+08,
 
-                 'Pica' => 7.19999999999955E+01,
 
-             ],
 
-             'ft' => [
 
-                 'm' => 3.04800000000000E-01,
 
-                 'mi' => 1.89393939393939E-04,
 
-                 'Nmi' => 1.64578833693305E-04,
 
-                 'in' => 1.20000000000000E+01,
 
-                 'ft' => 1.0,
 
-                 'yd' => 3.33333333223972E-01,
 
-                 'ang' => 3.04800000000000E+09,
 
-                 'Pica' => 8.63999999999946E+02,
 
-             ],
 
-             'yd' => [
 
-                 'm' => 9.14400000300000E-01,
 
-                 'mi' => 5.68181818368230E-04,
 
-                 'Nmi' => 4.93736501241901E-04,
 
-                 'in' => 3.60000000118110E+01,
 
-                 'ft' => 3.00000000000000E+00,
 
-                 'yd' => 1.0,
 
-                 'ang' => 9.14400000300000E+09,
 
-                 'Pica' => 2.59200000085023E+03,
 
-             ],
 
-             'ang' => [
 
-                 'm' => 1.00000000000000E-10,
 
-                 'mi' => 6.21371192237334E-14,
 
-                 'Nmi' => 5.39956803455724E-14,
 
-                 'in' => 3.93700787401575E-09,
 
-                 'ft' => 3.28083989501312E-10,
 
-                 'yd' => 1.09361329797891E-10,
 
-                 'ang' => 1.0,
 
-                 'Pica' => 2.83464566929116E-07,
 
-             ],
 
-             'Pica' => [
 
-                 'm' => 3.52777777777800E-04,
 
-                 'mi' => 2.19205948372629E-07,
 
-                 'Nmi' => 1.90484761219114E-07,
 
-                 'in' => 1.38888888888898E-02,
 
-                 'ft' => 1.15740740740748E-03,
 
-                 'yd' => 3.85802469009251E-04,
 
-                 'ang' => 3.52777777777800E+06,
 
-                 'Pica' => 1.0,
 
-             ],
 
-         ],
 
-         'Time' => [
 
-             'yr' => [
 
-                 'yr' => 1.0,
 
-                 'day' => 365.25,
 
-                 'hr' => 8766.0,
 
-                 'mn' => 525960.0,
 
-                 'sec' => 31557600.0,
 
-             ],
 
-             'day' => [
 
-                 'yr' => 2.73785078713210E-03,
 
-                 'day' => 1.0,
 
-                 'hr' => 24.0,
 
-                 'mn' => 1440.0,
 
-                 'sec' => 86400.0,
 
-             ],
 
-             'hr' => [
 
-                 'yr' => 1.14077116130504E-04,
 
-                 'day' => 4.16666666666667E-02,
 
-                 'hr' => 1.0,
 
-                 'mn' => 60.0,
 
-                 'sec' => 3600.0,
 
-             ],
 
-             'mn' => [
 
-                 'yr' => 1.90128526884174E-06,
 
-                 'day' => 6.94444444444444E-04,
 
-                 'hr' => 1.66666666666667E-02,
 
-                 'mn' => 1.0,
 
-                 'sec' => 60.0,
 
-             ],
 
-             'sec' => [
 
-                 'yr' => 3.16880878140289E-08,
 
-                 'day' => 1.15740740740741E-05,
 
-                 'hr' => 2.77777777777778E-04,
 
-                 'mn' => 1.66666666666667E-02,
 
-                 'sec' => 1.0,
 
-             ],
 
-         ],
 
-         'Pressure' => [
 
-             'Pa' => [
 
-                 'Pa' => 1.0,
 
-                 'p' => 1.0,
 
-                 'atm' => 9.86923299998193E-06,
 
-                 'at' => 9.86923299998193E-06,
 
-                 'mmHg' => 7.50061707998627E-03,
 
-             ],
 
-             'p' => [
 
-                 'Pa' => 1.0,
 
-                 'p' => 1.0,
 
-                 'atm' => 9.86923299998193E-06,
 
-                 'at' => 9.86923299998193E-06,
 
-                 'mmHg' => 7.50061707998627E-03,
 
-             ],
 
-             'atm' => [
 
-                 'Pa' => 1.01324996583000E+05,
 
-                 'p' => 1.01324996583000E+05,
 
-                 'atm' => 1.0,
 
-                 'at' => 1.0,
 
-                 'mmHg' => 760.0,
 
-             ],
 
-             'at' => [
 
-                 'Pa' => 1.01324996583000E+05,
 
-                 'p' => 1.01324996583000E+05,
 
-                 'atm' => 1.0,
 
-                 'at' => 1.0,
 
-                 'mmHg' => 760.0,
 
-             ],
 
-             'mmHg' => [
 
-                 'Pa' => 1.33322363925000E+02,
 
-                 'p' => 1.33322363925000E+02,
 
-                 'atm' => 1.31578947368421E-03,
 
-                 'at' => 1.31578947368421E-03,
 
-                 'mmHg' => 1.0,
 
-             ],
 
-         ],
 
-         'Force' => [
 
-             'N' => [
 
-                 'N' => 1.0,
 
-                 'dyn' => 1.0E+5,
 
-                 'dy' => 1.0E+5,
 
-                 'lbf' => 2.24808923655339E-01,
 
-             ],
 
-             'dyn' => [
 
-                 'N' => 1.0E-5,
 
-                 'dyn' => 1.0,
 
-                 'dy' => 1.0,
 
-                 'lbf' => 2.24808923655339E-06,
 
-             ],
 
-             'dy' => [
 
-                 'N' => 1.0E-5,
 
-                 'dyn' => 1.0,
 
-                 'dy' => 1.0,
 
-                 'lbf' => 2.24808923655339E-06,
 
-             ],
 
-             'lbf' => [
 
-                 'N' => 4.448222,
 
-                 'dyn' => 4.448222E+5,
 
-                 'dy' => 4.448222E+5,
 
-                 'lbf' => 1.0,
 
-             ],
 
-         ],
 
-         'Energy' => [
 
-             'J' => [
 
-                 'J' => 1.0,
 
-                 'e' => 9.99999519343231E+06,
 
-                 'c' => 2.39006249473467E-01,
 
-                 'cal' => 2.38846190642017E-01,
 
-                 'eV' => 6.24145700000000E+18,
 
-                 'ev' => 6.24145700000000E+18,
 
-                 'HPh' => 3.72506430801000E-07,
 
-                 'hh' => 3.72506430801000E-07,
 
-                 'Wh' => 2.77777916238711E-04,
 
-                 'wh' => 2.77777916238711E-04,
 
-                 'flb' => 2.37304222192651E+01,
 
-                 'BTU' => 9.47815067349015E-04,
 
-                 'btu' => 9.47815067349015E-04,
 
-             ],
 
-             'e' => [
 
-                 'J' => 1.00000048065700E-07,
 
-                 'e' => 1.0,
 
-                 'c' => 2.39006364353494E-08,
 
-                 'cal' => 2.38846305445111E-08,
 
-                 'eV' => 6.24146000000000E+11,
 
-                 'ev' => 6.24146000000000E+11,
 
-                 'HPh' => 3.72506609848824E-14,
 
-                 'hh' => 3.72506609848824E-14,
 
-                 'Wh' => 2.77778049754611E-11,
 
-                 'wh' => 2.77778049754611E-11,
 
-                 'flb' => 2.37304336254586E-06,
 
-                 'BTU' => 9.47815522922962E-11,
 
-                 'btu' => 9.47815522922962E-11,
 
-             ],
 
-             'c' => [
 
-                 'J' => 4.18399101363672E+00,
 
-                 'e' => 4.18398900257312E+07,
 
-                 'c' => 1.0,
 
-                 'cal' => 9.99330315287563E-01,
 
-                 'eV' => 2.61142000000000E+19,
 
-                 'ev' => 2.61142000000000E+19,
 
-                 'HPh' => 1.55856355899327E-06,
 
-                 'hh' => 1.55856355899327E-06,
 
-                 'Wh' => 1.16222030532950E-03,
 
-                 'wh' => 1.16222030532950E-03,
 
-                 'flb' => 9.92878733152102E+01,
 
-                 'BTU' => 3.96564972437776E-03,
 
-                 'btu' => 3.96564972437776E-03,
 
-             ],
 
-             'cal' => [
 
-                 'J' => 4.18679484613929E+00,
 
-                 'e' => 4.18679283372801E+07,
 
-                 'c' => 1.00067013349059E+00,
 
-                 'cal' => 1.0,
 
-                 'eV' => 2.61317000000000E+19,
 
-                 'ev' => 2.61317000000000E+19,
 
-                 'HPh' => 1.55960800463137E-06,
 
-                 'hh' => 1.55960800463137E-06,
 
-                 'Wh' => 1.16299914807955E-03,
 
-                 'wh' => 1.16299914807955E-03,
 
-                 'flb' => 9.93544094443283E+01,
 
-                 'BTU' => 3.96830723907002E-03,
 
-                 'btu' => 3.96830723907002E-03,
 
-             ],
 
-             'eV' => [
 
-                 'J' => 1.60219000146921E-19,
 
-                 'e' => 1.60218923136574E-12,
 
-                 'c' => 3.82933423195043E-20,
 
-                 'cal' => 3.82676978535648E-20,
 
-                 'eV' => 1.0,
 
-                 'ev' => 1.0,
 
-                 'HPh' => 5.96826078912344E-26,
 
-                 'hh' => 5.96826078912344E-26,
 
-                 'Wh' => 4.45053000026614E-23,
 
-                 'wh' => 4.45053000026614E-23,
 
-                 'flb' => 3.80206452103492E-18,
 
-                 'BTU' => 1.51857982414846E-22,
 
-                 'btu' => 1.51857982414846E-22,
 
-             ],
 
-             'ev' => [
 
-                 'J' => 1.60219000146921E-19,
 
-                 'e' => 1.60218923136574E-12,
 
-                 'c' => 3.82933423195043E-20,
 
-                 'cal' => 3.82676978535648E-20,
 
-                 'eV' => 1.0,
 
-                 'ev' => 1.0,
 
-                 'HPh' => 5.96826078912344E-26,
 
-                 'hh' => 5.96826078912344E-26,
 
-                 'Wh' => 4.45053000026614E-23,
 
-                 'wh' => 4.45053000026614E-23,
 
-                 'flb' => 3.80206452103492E-18,
 
-                 'BTU' => 1.51857982414846E-22,
 
-                 'btu' => 1.51857982414846E-22,
 
-             ],
 
-             'HPh' => [
 
-                 'J' => 2.68451741316170E+06,
 
-                 'e' => 2.68451612283024E+13,
 
-                 'c' => 6.41616438565991E+05,
 
-                 'cal' => 6.41186757845835E+05,
 
-                 'eV' => 1.67553000000000E+25,
 
-                 'ev' => 1.67553000000000E+25,
 
-                 'HPh' => 1.0,
 
-                 'hh' => 1.0,
 
-                 'Wh' => 7.45699653134593E+02,
 
-                 'wh' => 7.45699653134593E+02,
 
-                 'flb' => 6.37047316692964E+07,
 
-                 'BTU' => 2.54442605275546E+03,
 
-                 'btu' => 2.54442605275546E+03,
 
-             ],
 
-             'hh' => [
 
-                 'J' => 2.68451741316170E+06,
 
-                 'e' => 2.68451612283024E+13,
 
-                 'c' => 6.41616438565991E+05,
 
-                 'cal' => 6.41186757845835E+05,
 
-                 'eV' => 1.67553000000000E+25,
 
-                 'ev' => 1.67553000000000E+25,
 
-                 'HPh' => 1.0,
 
-                 'hh' => 1.0,
 
-                 'Wh' => 7.45699653134593E+02,
 
-                 'wh' => 7.45699653134593E+02,
 
-                 'flb' => 6.37047316692964E+07,
 
-                 'BTU' => 2.54442605275546E+03,
 
-                 'btu' => 2.54442605275546E+03,
 
-             ],
 
-             'Wh' => [
 
-                 'J' => 3.59999820554720E+03,
 
-                 'e' => 3.59999647518369E+10,
 
-                 'c' => 8.60422069219046E+02,
 
-                 'cal' => 8.59845857713046E+02,
 
-                 'eV' => 2.24692340000000E+22,
 
-                 'ev' => 2.24692340000000E+22,
 
-                 'HPh' => 1.34102248243839E-03,
 
-                 'hh' => 1.34102248243839E-03,
 
-                 'Wh' => 1.0,
 
-                 'wh' => 1.0,
 
-                 'flb' => 8.54294774062316E+04,
 
-                 'BTU' => 3.41213254164705E+00,
 
-                 'btu' => 3.41213254164705E+00,
 
-             ],
 
-             'wh' => [
 
-                 'J' => 3.59999820554720E+03,
 
-                 'e' => 3.59999647518369E+10,
 
-                 'c' => 8.60422069219046E+02,
 
-                 'cal' => 8.59845857713046E+02,
 
-                 'eV' => 2.24692340000000E+22,
 
-                 'ev' => 2.24692340000000E+22,
 
-                 'HPh' => 1.34102248243839E-03,
 
-                 'hh' => 1.34102248243839E-03,
 
-                 'Wh' => 1.0,
 
-                 'wh' => 1.0,
 
-                 'flb' => 8.54294774062316E+04,
 
-                 'BTU' => 3.41213254164705E+00,
 
-                 'btu' => 3.41213254164705E+00,
 
-             ],
 
-             'flb' => [
 
-                 'J' => 4.21400003236424E-02,
 
-                 'e' => 4.21399800687660E+05,
 
-                 'c' => 1.00717234301644E-02,
 
-                 'cal' => 1.00649785509554E-02,
 
-                 'eV' => 2.63015000000000E+17,
 
-                 'ev' => 2.63015000000000E+17,
 
-                 'HPh' => 1.56974211145130E-08,
 
-                 'hh' => 1.56974211145130E-08,
 
-                 'Wh' => 1.17055614802000E-05,
 
-                 'wh' => 1.17055614802000E-05,
 
-                 'flb' => 1.0,
 
-                 'BTU' => 3.99409272448406E-05,
 
-                 'btu' => 3.99409272448406E-05,
 
-             ],
 
-             'BTU' => [
 
-                 'J' => 1.05505813786749E+03,
 
-                 'e' => 1.05505763074665E+10,
 
-                 'c' => 2.52165488508168E+02,
 
-                 'cal' => 2.51996617135510E+02,
 
-                 'eV' => 6.58510000000000E+21,
 
-                 'ev' => 6.58510000000000E+21,
 
-                 'HPh' => 3.93015941224568E-04,
 
-                 'hh' => 3.93015941224568E-04,
 
-                 'Wh' => 2.93071851047526E-01,
 
-                 'wh' => 2.93071851047526E-01,
 
-                 'flb' => 2.50369750774671E+04,
 
-                 'BTU' => 1.0,
 
-                 'btu' => 1.0,
 
-             ],
 
-             'btu' => [
 
-                 'J' => 1.05505813786749E+03,
 
-                 'e' => 1.05505763074665E+10,
 
-                 'c' => 2.52165488508168E+02,
 
-                 'cal' => 2.51996617135510E+02,
 
-                 'eV' => 6.58510000000000E+21,
 
-                 'ev' => 6.58510000000000E+21,
 
-                 'HPh' => 3.93015941224568E-04,
 
-                 'hh' => 3.93015941224568E-04,
 
-                 'Wh' => 2.93071851047526E-01,
 
-                 'wh' => 2.93071851047526E-01,
 
-                 'flb' => 2.50369750774671E+04,
 
-                 'BTU' => 1.0,
 
-                 'btu' => 1.0,
 
-             ],
 
-         ],
 
-         'Power' => [
 
-             'HP' => [
 
-                 'HP' => 1.0,
 
-                 'h' => 1.0,
 
-                 'W' => 7.45701000000000E+02,
 
-                 'w' => 7.45701000000000E+02,
 
-             ],
 
-             'h' => [
 
-                 'HP' => 1.0,
 
-                 'h' => 1.0,
 
-                 'W' => 7.45701000000000E+02,
 
-                 'w' => 7.45701000000000E+02,
 
-             ],
 
-             'W' => [
 
-                 'HP' => 1.34102006031908E-03,
 
-                 'h' => 1.34102006031908E-03,
 
-                 'W' => 1.0,
 
-                 'w' => 1.0,
 
-             ],
 
-             'w' => [
 
-                 'HP' => 1.34102006031908E-03,
 
-                 'h' => 1.34102006031908E-03,
 
-                 'W' => 1.0,
 
-                 'w' => 1.0,
 
-             ],
 
-         ],
 
-         'Magnetism' => [
 
-             'T' => [
 
-                 'T' => 1.0,
 
-                 'ga' => 10000.0,
 
-             ],
 
-             'ga' => [
 
-                 'T' => 0.0001,
 
-                 'ga' => 1.0,
 
-             ],
 
-         ],
 
-         'Liquid' => [
 
-             'tsp' => [
 
-                 'tsp' => 1.0,
 
-                 'tbs' => 3.33333333333333E-01,
 
-                 'oz' => 1.66666666666667E-01,
 
-                 'cup' => 2.08333333333333E-02,
 
-                 'pt' => 1.04166666666667E-02,
 
-                 'us_pt' => 1.04166666666667E-02,
 
-                 'uk_pt' => 8.67558516821960E-03,
 
-                 'qt' => 5.20833333333333E-03,
 
-                 'gal' => 1.30208333333333E-03,
 
-                 'l' => 4.92999408400710E-03,
 
-                 'lt' => 4.92999408400710E-03,
 
-             ],
 
-             'tbs' => [
 
-                 'tsp' => 3.00000000000000E+00,
 
-                 'tbs' => 1.0,
 
-                 'oz' => 5.00000000000000E-01,
 
-                 'cup' => 6.25000000000000E-02,
 
-                 'pt' => 3.12500000000000E-02,
 
-                 'us_pt' => 3.12500000000000E-02,
 
-                 'uk_pt' => 2.60267555046588E-02,
 
-                 'qt' => 1.56250000000000E-02,
 
-                 'gal' => 3.90625000000000E-03,
 
-                 'l' => 1.47899822520213E-02,
 
-                 'lt' => 1.47899822520213E-02,
 
-             ],
 
-             'oz' => [
 
-                 'tsp' => 6.00000000000000E+00,
 
-                 'tbs' => 2.00000000000000E+00,
 
-                 'oz' => 1.0,
 
-                 'cup' => 1.25000000000000E-01,
 
-                 'pt' => 6.25000000000000E-02,
 
-                 'us_pt' => 6.25000000000000E-02,
 
-                 'uk_pt' => 5.20535110093176E-02,
 
-                 'qt' => 3.12500000000000E-02,
 
-                 'gal' => 7.81250000000000E-03,
 
-                 'l' => 2.95799645040426E-02,
 
-                 'lt' => 2.95799645040426E-02,
 
-             ],
 
-             'cup' => [
 
-                 'tsp' => 4.80000000000000E+01,
 
-                 'tbs' => 1.60000000000000E+01,
 
-                 'oz' => 8.00000000000000E+00,
 
-                 'cup' => 1.0,
 
-                 'pt' => 5.00000000000000E-01,
 
-                 'us_pt' => 5.00000000000000E-01,
 
-                 'uk_pt' => 4.16428088074541E-01,
 
-                 'qt' => 2.50000000000000E-01,
 
-                 'gal' => 6.25000000000000E-02,
 
-                 'l' => 2.36639716032341E-01,
 
-                 'lt' => 2.36639716032341E-01,
 
-             ],
 
-             'pt' => [
 
-                 'tsp' => 9.60000000000000E+01,
 
-                 'tbs' => 3.20000000000000E+01,
 
-                 'oz' => 1.60000000000000E+01,
 
-                 'cup' => 2.00000000000000E+00,
 
-                 'pt' => 1.0,
 
-                 'us_pt' => 1.0,
 
-                 'uk_pt' => 8.32856176149081E-01,
 
-                 'qt' => 5.00000000000000E-01,
 
-                 'gal' => 1.25000000000000E-01,
 
-                 'l' => 4.73279432064682E-01,
 
-                 'lt' => 4.73279432064682E-01,
 
-             ],
 
-             'us_pt' => [
 
-                 'tsp' => 9.60000000000000E+01,
 
-                 'tbs' => 3.20000000000000E+01,
 
-                 'oz' => 1.60000000000000E+01,
 
-                 'cup' => 2.00000000000000E+00,
 
-                 'pt' => 1.0,
 
-                 'us_pt' => 1.0,
 
-                 'uk_pt' => 8.32856176149081E-01,
 
-                 'qt' => 5.00000000000000E-01,
 
-                 'gal' => 1.25000000000000E-01,
 
-                 'l' => 4.73279432064682E-01,
 
-                 'lt' => 4.73279432064682E-01,
 
-             ],
 
-             'uk_pt' => [
 
-                 'tsp' => 1.15266000000000E+02,
 
-                 'tbs' => 3.84220000000000E+01,
 
-                 'oz' => 1.92110000000000E+01,
 
-                 'cup' => 2.40137500000000E+00,
 
-                 'pt' => 1.20068750000000E+00,
 
-                 'us_pt' => 1.20068750000000E+00,
 
-                 'uk_pt' => 1.0,
 
-                 'qt' => 6.00343750000000E-01,
 
-                 'gal' => 1.50085937500000E-01,
 
-                 'l' => 5.68260698087162E-01,
 
-                 'lt' => 5.68260698087162E-01,
 
-             ],
 
-             'qt' => [
 
-                 'tsp' => 1.92000000000000E+02,
 
-                 'tbs' => 6.40000000000000E+01,
 
-                 'oz' => 3.20000000000000E+01,
 
-                 'cup' => 4.00000000000000E+00,
 
-                 'pt' => 2.00000000000000E+00,
 
-                 'us_pt' => 2.00000000000000E+00,
 
-                 'uk_pt' => 1.66571235229816E+00,
 
-                 'qt' => 1.0,
 
-                 'gal' => 2.50000000000000E-01,
 
-                 'l' => 9.46558864129363E-01,
 
-                 'lt' => 9.46558864129363E-01,
 
-             ],
 
-             'gal' => [
 
-                 'tsp' => 7.68000000000000E+02,
 
-                 'tbs' => 2.56000000000000E+02,
 
-                 'oz' => 1.28000000000000E+02,
 
-                 'cup' => 1.60000000000000E+01,
 
-                 'pt' => 8.00000000000000E+00,
 
-                 'us_pt' => 8.00000000000000E+00,
 
-                 'uk_pt' => 6.66284940919265E+00,
 
-                 'qt' => 4.00000000000000E+00,
 
-                 'gal' => 1.0,
 
-                 'l' => 3.78623545651745E+00,
 
-                 'lt' => 3.78623545651745E+00,
 
-             ],
 
-             'l' => [
 
-                 'tsp' => 2.02840000000000E+02,
 
-                 'tbs' => 6.76133333333333E+01,
 
-                 'oz' => 3.38066666666667E+01,
 
-                 'cup' => 4.22583333333333E+00,
 
-                 'pt' => 2.11291666666667E+00,
 
-                 'us_pt' => 2.11291666666667E+00,
 
-                 'uk_pt' => 1.75975569552166E+00,
 
-                 'qt' => 1.05645833333333E+00,
 
-                 'gal' => 2.64114583333333E-01,
 
-                 'l' => 1.0,
 
-                 'lt' => 1.0,
 
-             ],
 
-             'lt' => [
 
-                 'tsp' => 2.02840000000000E+02,
 
-                 'tbs' => 6.76133333333333E+01,
 
-                 'oz' => 3.38066666666667E+01,
 
-                 'cup' => 4.22583333333333E+00,
 
-                 'pt' => 2.11291666666667E+00,
 
-                 'us_pt' => 2.11291666666667E+00,
 
-                 'uk_pt' => 1.75975569552166E+00,
 
-                 'qt' => 1.05645833333333E+00,
 
-                 'gal' => 2.64114583333333E-01,
 
-                 'l' => 1.0,
 
-                 'lt' => 1.0,
 
-             ],
 
-         ],
 
-     ];
 
-     /**
 
-      * parseComplex.
 
-      *
 
-      * Parses a complex number into its real and imaginary parts, and an I or J suffix
 
-      *
 
-      * @deprecated 2.0.0 No longer used by internal code. Please use the Complex\Complex class instead
 
-      *
 
-      * @param string $complexNumber The complex number
 
-      *
 
-      * @return mixed[] Indexed on "real", "imaginary" and "suffix"
 
-      */
 
-     public static function parseComplex($complexNumber)
 
-     {
 
-         $complex = new Complex($complexNumber);
 
-         return [
 
-             'real' => $complex->getReal(),
 
-             'imaginary' => $complex->getImaginary(),
 
-             'suffix' => $complex->getSuffix(),
 
-         ];
 
-     }
 
-     /**
 
-      * Formats a number base string value with leading zeroes.
 
-      *
 
-      * @param string $xVal The "number" to pad
 
-      * @param int $places The length that we want to pad this value
 
-      *
 
-      * @return string The padded "number"
 
-      */
 
-     private static function nbrConversionFormat($xVal, $places)
 
-     {
 
-         if ($places !== null) {
 
-             if (is_numeric($places)) {
 
-                 $places = (int) $places;
 
-             } else {
 
-                 return Functions::VALUE();
 
-             }
 
-             if ($places < 0) {
 
-                 return Functions::NAN();
 
-             }
 
-             if (strlen($xVal) <= $places) {
 
-                 return substr(str_pad($xVal, $places, '0', STR_PAD_LEFT), -10);
 
-             }
 
-             return Functions::NAN();
 
-         }
 
-         return substr($xVal, -10);
 
-     }
 
-     /**
 
-      * BESSELI.
 
-      *
 
-      *    Returns the modified Bessel function In(x), which is equivalent to the Bessel function evaluated
 
-      *        for purely imaginary arguments
 
-      *
 
-      *    Excel Function:
 
-      *        BESSELI(x,ord)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param float $x The value at which to evaluate the function.
 
-      *                                If x is nonnumeric, BESSELI returns the #VALUE! error value.
 
-      * @param int $ord The order of the Bessel function.
 
-      *                                If ord is not an integer, it is truncated.
 
-      *                                If $ord is nonnumeric, BESSELI returns the #VALUE! error value.
 
-      *                                If $ord < 0, BESSELI returns the #NUM! error value.
 
-      *
 
-      * @return float
 
-      */
 
-     public static function BESSELI($x, $ord)
 
-     {
 
-         $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x);
 
-         $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord);
 
-         if ((is_numeric($x)) && (is_numeric($ord))) {
 
-             $ord = floor($ord);
 
-             if ($ord < 0) {
 
-                 return Functions::NAN();
 
-             }
 
-             if (abs($x) <= 30) {
 
-                 $fResult = $fTerm = pow($x / 2, $ord) / MathTrig::FACT($ord);
 
-                 $ordK = 1;
 
-                 $fSqrX = ($x * $x) / 4;
 
-                 do {
 
-                     $fTerm *= $fSqrX;
 
-                     $fTerm /= ($ordK * ($ordK + $ord));
 
-                     $fResult += $fTerm;
 
-                 } while ((abs($fTerm) > 1e-12) && (++$ordK < 100));
 
-             } else {
 
-                 $f_2_PI = 2 * M_PI;
 
-                 $fXAbs = abs($x);
 
-                 $fResult = exp($fXAbs) / sqrt($f_2_PI * $fXAbs);
 
-                 if (($ord & 1) && ($x < 0)) {
 
-                     $fResult = -$fResult;
 
-                 }
 
-             }
 
-             return (is_nan($fResult)) ? Functions::NAN() : $fResult;
 
-         }
 
-         return Functions::VALUE();
 
-     }
 
-     /**
 
-      * BESSELJ.
 
-      *
 
-      *    Returns the Bessel function
 
-      *
 
-      *    Excel Function:
 
-      *        BESSELJ(x,ord)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param float $x The value at which to evaluate the function.
 
-      *                                If x is nonnumeric, BESSELJ returns the #VALUE! error value.
 
-      * @param int $ord The order of the Bessel function. If n is not an integer, it is truncated.
 
-      *                                If $ord is nonnumeric, BESSELJ returns the #VALUE! error value.
 
-      *                                If $ord < 0, BESSELJ returns the #NUM! error value.
 
-      *
 
-      * @return float
 
-      */
 
-     public static function BESSELJ($x, $ord)
 
-     {
 
-         $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x);
 
-         $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord);
 
-         if ((is_numeric($x)) && (is_numeric($ord))) {
 
-             $ord = floor($ord);
 
-             if ($ord < 0) {
 
-                 return Functions::NAN();
 
-             }
 
-             $fResult = 0;
 
-             if (abs($x) <= 30) {
 
-                 $fResult = $fTerm = pow($x / 2, $ord) / MathTrig::FACT($ord);
 
-                 $ordK = 1;
 
-                 $fSqrX = ($x * $x) / -4;
 
-                 do {
 
-                     $fTerm *= $fSqrX;
 
-                     $fTerm /= ($ordK * ($ordK + $ord));
 
-                     $fResult += $fTerm;
 
-                 } while ((abs($fTerm) > 1e-12) && (++$ordK < 100));
 
-             } else {
 
-                 $f_PI_DIV_2 = M_PI / 2;
 
-                 $f_PI_DIV_4 = M_PI / 4;
 
-                 $fXAbs = abs($x);
 
-                 $fResult = sqrt(Functions::M_2DIVPI / $fXAbs) * cos($fXAbs - $ord * $f_PI_DIV_2 - $f_PI_DIV_4);
 
-                 if (($ord & 1) && ($x < 0)) {
 
-                     $fResult = -$fResult;
 
-                 }
 
-             }
 
-             return (is_nan($fResult)) ? Functions::NAN() : $fResult;
 
-         }
 
-         return Functions::VALUE();
 
-     }
 
-     private static function besselK0($fNum)
 
-     {
 
-         if ($fNum <= 2) {
 
-             $fNum2 = $fNum * 0.5;
 
-             $y = ($fNum2 * $fNum2);
 
-             $fRet = -log($fNum2) * self::BESSELI($fNum, 0) +
 
-                 (-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y *
 
-                                     (0.10750e-3 + $y * 0.74e-5))))));
 
-         } else {
 
-             $y = 2 / $fNum;
 
-             $fRet = exp(-$fNum) / sqrt($fNum) *
 
-                 (1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y *
 
-                                 (0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3))))));
 
-         }
 
-         return $fRet;
 
-     }
 
-     private static function besselK1($fNum)
 
-     {
 
-         if ($fNum <= 2) {
 
-             $fNum2 = $fNum * 0.5;
 
-             $y = ($fNum2 * $fNum2);
 
-             $fRet = log($fNum2) * self::BESSELI($fNum, 1) +
 
-                 (1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y *
 
-                                     (-0.110404e-2 + $y * (-0.4686e-4))))))) / $fNum;
 
-         } else {
 
-             $y = 2 / $fNum;
 
-             $fRet = exp(-$fNum) / sqrt($fNum) *
 
-                 (1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y *
 
-                                     (0.325614e-2 + $y * (-0.68245e-3)))))));
 
-         }
 
-         return $fRet;
 
-     }
 
-     /**
 
-      * BESSELK.
 
-      *
 
-      *    Returns the modified Bessel function Kn(x), which is equivalent to the Bessel functions evaluated
 
-      *        for purely imaginary arguments.
 
-      *
 
-      *    Excel Function:
 
-      *        BESSELK(x,ord)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param float $x The value at which to evaluate the function.
 
-      *                                If x is nonnumeric, BESSELK returns the #VALUE! error value.
 
-      * @param int $ord The order of the Bessel function. If n is not an integer, it is truncated.
 
-      *                                If $ord is nonnumeric, BESSELK returns the #VALUE! error value.
 
-      *                                If $ord < 0, BESSELK returns the #NUM! error value.
 
-      *
 
-      * @return float
 
-      */
 
-     public static function BESSELK($x, $ord)
 
-     {
 
-         $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x);
 
-         $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord);
 
-         if ((is_numeric($x)) && (is_numeric($ord))) {
 
-             if (($ord < 0) || ($x == 0.0)) {
 
-                 return Functions::NAN();
 
-             }
 
-             switch (floor($ord)) {
 
-                 case 0:
 
-                     $fBk = self::besselK0($x);
 
-                     break;
 
-                 case 1:
 
-                     $fBk = self::besselK1($x);
 
-                     break;
 
-                 default:
 
-                     $fTox = 2 / $x;
 
-                     $fBkm = self::besselK0($x);
 
-                     $fBk = self::besselK1($x);
 
-                     for ($n = 1; $n < $ord; ++$n) {
 
-                         $fBkp = $fBkm + $n * $fTox * $fBk;
 
-                         $fBkm = $fBk;
 
-                         $fBk = $fBkp;
 
-                     }
 
-             }
 
-             return (is_nan($fBk)) ? Functions::NAN() : $fBk;
 
-         }
 
-         return Functions::VALUE();
 
-     }
 
-     private static function besselY0($fNum)
 
-     {
 
-         if ($fNum < 8.0) {
 
-             $y = ($fNum * $fNum);
 
-             $f1 = -2957821389.0 + $y * (7062834065.0 + $y * (-512359803.6 + $y * (10879881.29 + $y * (-86327.92757 + $y * 228.4622733))));
 
-             $f2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y))));
 
-             $fRet = $f1 / $f2 + 0.636619772 * self::BESSELJ($fNum, 0) * log($fNum);
 
-         } else {
 
-             $z = 8.0 / $fNum;
 
-             $y = ($z * $z);
 
-             $xx = $fNum - 0.785398164;
 
-             $f1 = 1 + $y * (-0.1098628627e-2 + $y * (0.2734510407e-4 + $y * (-0.2073370639e-5 + $y * 0.2093887211e-6)));
 
-             $f2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7))));
 
-             $fRet = sqrt(0.636619772 / $fNum) * (sin($xx) * $f1 + $z * cos($xx) * $f2);
 
-         }
 
-         return $fRet;
 
-     }
 
-     private static function besselY1($fNum)
 
-     {
 
-         if ($fNum < 8.0) {
 
-             $y = ($fNum * $fNum);
 
-             $f1 = $fNum * (-0.4900604943e13 + $y * (0.1275274390e13 + $y * (-0.5153438139e11 + $y * (0.7349264551e9 + $y *
 
-                                 (-0.4237922726e7 + $y * 0.8511937935e4)))));
 
-             $f2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y *
 
-                             (0.1020426050e6 + $y * (0.3549632885e3 + $y)))));
 
-             $fRet = $f1 / $f2 + 0.636619772 * (self::BESSELJ($fNum, 1) * log($fNum) - 1 / $fNum);
 
-         } else {
 
-             $fRet = sqrt(0.636619772 / $fNum) * sin($fNum - 2.356194491);
 
-         }
 
-         return $fRet;
 
-     }
 
-     /**
 
-      * BESSELY.
 
-      *
 
-      * Returns the Bessel function, which is also called the Weber function or the Neumann function.
 
-      *
 
-      *    Excel Function:
 
-      *        BESSELY(x,ord)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param float $x The value at which to evaluate the function.
 
-      *                                If x is nonnumeric, BESSELK returns the #VALUE! error value.
 
-      * @param int $ord The order of the Bessel function. If n is not an integer, it is truncated.
 
-      *                                If $ord is nonnumeric, BESSELK returns the #VALUE! error value.
 
-      *                                If $ord < 0, BESSELK returns the #NUM! error value.
 
-      *
 
-      * @return float
 
-      */
 
-     public static function BESSELY($x, $ord)
 
-     {
 
-         $x = ($x === null) ? 0.0 : Functions::flattenSingleValue($x);
 
-         $ord = ($ord === null) ? 0.0 : Functions::flattenSingleValue($ord);
 
-         if ((is_numeric($x)) && (is_numeric($ord))) {
 
-             if (($ord < 0) || ($x == 0.0)) {
 
-                 return Functions::NAN();
 
-             }
 
-             switch (floor($ord)) {
 
-                 case 0:
 
-                     $fBy = self::besselY0($x);
 
-                     break;
 
-                 case 1:
 
-                     $fBy = self::besselY1($x);
 
-                     break;
 
-                 default:
 
-                     $fTox = 2 / $x;
 
-                     $fBym = self::besselY0($x);
 
-                     $fBy = self::besselY1($x);
 
-                     for ($n = 1; $n < $ord; ++$n) {
 
-                         $fByp = $n * $fTox * $fBy - $fBym;
 
-                         $fBym = $fBy;
 
-                         $fBy = $fByp;
 
-                     }
 
-             }
 
-             return (is_nan($fBy)) ? Functions::NAN() : $fBy;
 
-         }
 
-         return Functions::VALUE();
 
-     }
 
-     /**
 
-      * BINTODEC.
 
-      *
 
-      * Return a binary value as decimal.
 
-      *
 
-      * Excel Function:
 
-      *        BIN2DEC(x)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The binary number (as a string) that you want to convert. The number
 
-      *                                cannot contain more than 10 characters (10 bits). The most significant
 
-      *                                bit of number is the sign bit. The remaining 9 bits are magnitude bits.
 
-      *                                Negative numbers are represented using two's-complement notation.
 
-      *                                If number is not a valid binary number, or if number contains more than
 
-      *                                10 characters (10 bits), BIN2DEC returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function BINTODEC($x)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         if (is_bool($x)) {
 
-             if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) {
 
-                 $x = (int) $x;
 
-             } else {
 
-                 return Functions::VALUE();
 
-             }
 
-         }
 
-         if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) {
 
-             $x = floor($x);
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[01]/', $x, $out)) {
 
-             return Functions::NAN();
 
-         }
 
-         if (strlen($x) > 10) {
 
-             return Functions::NAN();
 
-         } elseif (strlen($x) == 10) {
 
-             //    Two's Complement
 
-             $x = substr($x, -9);
 
-             return '-' . (512 - bindec($x));
 
-         }
 
-         return bindec($x);
 
-     }
 
-     /**
 
-      * BINTOHEX.
 
-      *
 
-      * Return a binary value as hex.
 
-      *
 
-      * Excel Function:
 
-      *        BIN2HEX(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The binary number (as a string) that you want to convert. The number
 
-      *                                cannot contain more than 10 characters (10 bits). The most significant
 
-      *                                bit of number is the sign bit. The remaining 9 bits are magnitude bits.
 
-      *                                Negative numbers are represented using two's-complement notation.
 
-      *                                If number is not a valid binary number, or if number contains more than
 
-      *                                10 characters (10 bits), BIN2HEX returns the #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted, BIN2HEX uses the
 
-      *                                minimum number of characters necessary. Places is useful for padding the
 
-      *                                return value with leading 0s (zeros).
 
-      *                                If places is not an integer, it is truncated.
 
-      *                                If places is nonnumeric, BIN2HEX returns the #VALUE! error value.
 
-      *                                If places is negative, BIN2HEX returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function BINTOHEX($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         // Argument X
 
-         if (is_bool($x)) {
 
-             if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) {
 
-                 $x = (int) $x;
 
-             } else {
 
-                 return Functions::VALUE();
 
-             }
 
-         }
 
-         if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) {
 
-             $x = floor($x);
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[01]/', $x, $out)) {
 
-             return Functions::NAN();
 
-         }
 
-         if (strlen($x) > 10) {
 
-             return Functions::NAN();
 
-         } elseif (strlen($x) == 10) {
 
-             //    Two's Complement
 
-             return str_repeat('F', 8) . substr(strtoupper(dechex(bindec(substr($x, -9)))), -2);
 
-         }
 
-         $hexVal = (string) strtoupper(dechex(bindec($x)));
 
-         return self::nbrConversionFormat($hexVal, $places);
 
-     }
 
-     /**
 
-      * BINTOOCT.
 
-      *
 
-      * Return a binary value as octal.
 
-      *
 
-      * Excel Function:
 
-      *        BIN2OCT(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The binary number (as a string) that you want to convert. The number
 
-      *                                cannot contain more than 10 characters (10 bits). The most significant
 
-      *                                bit of number is the sign bit. The remaining 9 bits are magnitude bits.
 
-      *                                Negative numbers are represented using two's-complement notation.
 
-      *                                If number is not a valid binary number, or if number contains more than
 
-      *                                10 characters (10 bits), BIN2OCT returns the #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted, BIN2OCT uses the
 
-      *                                minimum number of characters necessary. Places is useful for padding the
 
-      *                                return value with leading 0s (zeros).
 
-      *                                If places is not an integer, it is truncated.
 
-      *                                If places is nonnumeric, BIN2OCT returns the #VALUE! error value.
 
-      *                                If places is negative, BIN2OCT returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function BINTOOCT($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) {
 
-                 $x = (int) $x;
 
-             } else {
 
-                 return Functions::VALUE();
 
-             }
 
-         }
 
-         if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_GNUMERIC) {
 
-             $x = floor($x);
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[01]/', $x, $out)) {
 
-             return Functions::NAN();
 
-         }
 
-         if (strlen($x) > 10) {
 
-             return Functions::NAN();
 
-         } elseif (strlen($x) == 10) {
 
-             //    Two's Complement
 
-             return str_repeat('7', 7) . substr(strtoupper(decoct(bindec(substr($x, -9)))), -3);
 
-         }
 
-         $octVal = (string) decoct(bindec($x));
 
-         return self::nbrConversionFormat($octVal, $places);
 
-     }
 
-     /**
 
-      * DECTOBIN.
 
-      *
 
-      * Return a decimal value as binary.
 
-      *
 
-      * Excel Function:
 
-      *        DEC2BIN(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The decimal integer you want to convert. If number is negative,
 
-      *                                valid place values are ignored and DEC2BIN returns a 10-character
 
-      *                                (10-bit) binary number in which the most significant bit is the sign
 
-      *                                bit. The remaining 9 bits are magnitude bits. Negative numbers are
 
-      *                                represented using two's-complement notation.
 
-      *                                If number < -512 or if number > 511, DEC2BIN returns the #NUM! error
 
-      *                                value.
 
-      *                                If number is nonnumeric, DEC2BIN returns the #VALUE! error value.
 
-      *                                If DEC2BIN requires more than places characters, it returns the #NUM!
 
-      *                                error value.
 
-      * @param int $places The number of characters to use. If places is omitted, DEC2BIN uses
 
-      *                                the minimum number of characters necessary. Places is useful for
 
-      *                                padding the return value with leading 0s (zeros).
 
-      *                                If places is not an integer, it is truncated.
 
-      *                                If places is nonnumeric, DEC2BIN returns the #VALUE! error value.
 
-      *                                If places is zero or negative, DEC2BIN returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function DECTOBIN($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) {
 
-                 $x = (int) $x;
 
-             } else {
 
-                 return Functions::VALUE();
 
-             }
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) floor($x);
 
-         if ($x < -512 || $x > 511) {
 
-             return Functions::NAN();
 
-         }
 
-         $r = decbin($x);
 
-         // Two's Complement
 
-         $r = substr($r, -10);
 
-         if (strlen($r) >= 11) {
 
-             return Functions::NAN();
 
-         }
 
-         return self::nbrConversionFormat($r, $places);
 
-     }
 
-     /**
 
-      * DECTOHEX.
 
-      *
 
-      * Return a decimal value as hex.
 
-      *
 
-      * Excel Function:
 
-      *        DEC2HEX(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The decimal integer you want to convert. If number is negative,
 
-      *                                places is ignored and DEC2HEX returns a 10-character (40-bit)
 
-      *                                hexadecimal number in which the most significant bit is the sign
 
-      *                                bit. The remaining 39 bits are magnitude bits. Negative numbers
 
-      *                                are represented using two's-complement notation.
 
-      *                                If number < -549,755,813,888 or if number > 549,755,813,887,
 
-      *                                DEC2HEX returns the #NUM! error value.
 
-      *                                If number is nonnumeric, DEC2HEX returns the #VALUE! error value.
 
-      *                                If DEC2HEX requires more than places characters, it returns the
 
-      *                                #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted, DEC2HEX uses
 
-      *                                the minimum number of characters necessary. Places is useful for
 
-      *                                padding the return value with leading 0s (zeros).
 
-      *                                If places is not an integer, it is truncated.
 
-      *                                If places is nonnumeric, DEC2HEX returns the #VALUE! error value.
 
-      *                                If places is zero or negative, DEC2HEX returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function DECTOHEX($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) {
 
-                 $x = (int) $x;
 
-             } else {
 
-                 return Functions::VALUE();
 
-             }
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) floor($x);
 
-         $r = strtoupper(dechex($x));
 
-         if (strlen($r) == 8) {
 
-             //    Two's Complement
 
-             $r = 'FF' . $r;
 
-         }
 
-         return self::nbrConversionFormat($r, $places);
 
-     }
 
-     /**
 
-      * DECTOOCT.
 
-      *
 
-      * Return an decimal value as octal.
 
-      *
 
-      * Excel Function:
 
-      *        DEC2OCT(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The decimal integer you want to convert. If number is negative,
 
-      *                                places is ignored and DEC2OCT returns a 10-character (30-bit)
 
-      *                                octal number in which the most significant bit is the sign bit.
 
-      *                                The remaining 29 bits are magnitude bits. Negative numbers are
 
-      *                                represented using two's-complement notation.
 
-      *                                If number < -536,870,912 or if number > 536,870,911, DEC2OCT
 
-      *                                returns the #NUM! error value.
 
-      *                                If number is nonnumeric, DEC2OCT returns the #VALUE! error value.
 
-      *                                If DEC2OCT requires more than places characters, it returns the
 
-      *                                #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted, DEC2OCT uses
 
-      *                                the minimum number of characters necessary. Places is useful for
 
-      *                                padding the return value with leading 0s (zeros).
 
-      *                                If places is not an integer, it is truncated.
 
-      *                                If places is nonnumeric, DEC2OCT returns the #VALUE! error value.
 
-      *                                If places is zero or negative, DEC2OCT returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function DECTOOCT($x, $places = null)
 
-     {
 
-         $xorig = $x;
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             if (Functions::getCompatibilityMode() == Functions::COMPATIBILITY_OPENOFFICE) {
 
-                 $x = (int) $x;
 
-             } else {
 
-                 return Functions::VALUE();
 
-             }
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) floor($x);
 
-         $r = decoct($x);
 
-         if (strlen($r) == 11) {
 
-             //    Two's Complement
 
-             $r = substr($r, -10);
 
-         }
 
-         return self::nbrConversionFormat($r, $places);
 
-     }
 
-     /**
 
-      * HEXTOBIN.
 
-      *
 
-      * Return a hex value as binary.
 
-      *
 
-      * Excel Function:
 
-      *        HEX2BIN(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x the hexadecimal number you want to convert.
 
-      *                  Number cannot contain more than 10 characters.
 
-      *                  The most significant bit of number is the sign bit (40th bit from the right).
 
-      *                  The remaining 9 bits are magnitude bits.
 
-      *                  Negative numbers are represented using two's-complement notation.
 
-      *                  If number is negative, HEX2BIN ignores places and returns a 10-character binary number.
 
-      *                  If number is negative, it cannot be less than FFFFFFFE00,
 
-      *                      and if number is positive, it cannot be greater than 1FF.
 
-      *                  If number is not a valid hexadecimal number, HEX2BIN returns the #NUM! error value.
 
-      *                  If HEX2BIN requires more than places characters, it returns the #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted,
 
-      *                                    HEX2BIN uses the minimum number of characters necessary. Places
 
-      *                                    is useful for padding the return value with leading 0s (zeros).
 
-      *                                    If places is not an integer, it is truncated.
 
-      *                                    If places is nonnumeric, HEX2BIN returns the #VALUE! error value.
 
-      *                                    If places is negative, HEX2BIN returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function HEXTOBIN($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) {
 
-             return Functions::NAN();
 
-         }
 
-         return self::DECTOBIN(self::HEXTODEC($x), $places);
 
-     }
 
-     /**
 
-      * HEXTODEC.
 
-      *
 
-      * Return a hex value as decimal.
 
-      *
 
-      * Excel Function:
 
-      *        HEX2DEC(x)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The hexadecimal number you want to convert. This number cannot
 
-      *                                contain more than 10 characters (40 bits). The most significant
 
-      *                                bit of number is the sign bit. The remaining 39 bits are magnitude
 
-      *                                bits. Negative numbers are represented using two's-complement
 
-      *                                notation.
 
-      *                                If number is not a valid hexadecimal number, HEX2DEC returns the
 
-      *                                #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function HEXTODEC($x)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         if (is_bool($x)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) {
 
-             return Functions::NAN();
 
-         }
 
-         if (strlen($x) > 10) {
 
-             return Functions::NAN();
 
-         }
 
-         $binX = '';
 
-         foreach (str_split($x) as $char) {
 
-             $binX .= str_pad(base_convert($char, 16, 2), 4, '0', STR_PAD_LEFT);
 
-         }
 
-         if (strlen($binX) == 40 && $binX[0] == '1') {
 
-             for ($i = 0; $i < 40; ++$i) {
 
-                 $binX[$i] = ($binX[$i] == '1' ? '0' : '1');
 
-             }
 
-             return (bindec($binX) + 1) * -1;
 
-         }
 
-         return bindec($binX);
 
-     }
 
-     /**
 
-      * HEXTOOCT.
 
-      *
 
-      * Return a hex value as octal.
 
-      *
 
-      * Excel Function:
 
-      *        HEX2OCT(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The hexadecimal number you want to convert. Number cannot
 
-      *                                    contain more than 10 characters. The most significant bit of
 
-      *                                    number is the sign bit. The remaining 39 bits are magnitude
 
-      *                                    bits. Negative numbers are represented using two's-complement
 
-      *                                    notation.
 
-      *                                    If number is negative, HEX2OCT ignores places and returns a
 
-      *                                    10-character octal number.
 
-      *                                    If number is negative, it cannot be less than FFE0000000, and
 
-      *                                    if number is positive, it cannot be greater than 1FFFFFFF.
 
-      *                                    If number is not a valid hexadecimal number, HEX2OCT returns
 
-      *                                    the #NUM! error value.
 
-      *                                    If HEX2OCT requires more than places characters, it returns
 
-      *                                    the #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted, HEX2OCT
 
-      *                                    uses the minimum number of characters necessary. Places is
 
-      *                                    useful for padding the return value with leading 0s (zeros).
 
-      *                                    If places is not an integer, it is truncated.
 
-      *                                    If places is nonnumeric, HEX2OCT returns the #VALUE! error
 
-      *                                    value.
 
-      *                                    If places is negative, HEX2OCT returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function HEXTOOCT($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) $x;
 
-         if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) {
 
-             return Functions::NAN();
 
-         }
 
-         $decimal = self::HEXTODEC($x);
 
-         if ($decimal < -536870912 || $decimal > 536870911) {
 
-             return Functions::NAN();
 
-         }
 
-         return self::DECTOOCT($decimal, $places);
 
-     }
 
-     /**
 
-      * OCTTOBIN.
 
-      *
 
-      * Return an octal value as binary.
 
-      *
 
-      * Excel Function:
 
-      *        OCT2BIN(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The octal number you want to convert. Number may not
 
-      *                                    contain more than 10 characters. The most significant
 
-      *                                    bit of number is the sign bit. The remaining 29 bits
 
-      *                                    are magnitude bits. Negative numbers are represented
 
-      *                                    using two's-complement notation.
 
-      *                                    If number is negative, OCT2BIN ignores places and returns
 
-      *                                    a 10-character binary number.
 
-      *                                    If number is negative, it cannot be less than 7777777000,
 
-      *                                    and if number is positive, it cannot be greater than 777.
 
-      *                                    If number is not a valid octal number, OCT2BIN returns
 
-      *                                    the #NUM! error value.
 
-      *                                    If OCT2BIN requires more than places characters, it
 
-      *                                    returns the #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted,
 
-      *                                    OCT2BIN uses the minimum number of characters necessary.
 
-      *                                    Places is useful for padding the return value with
 
-      *                                    leading 0s (zeros).
 
-      *                                    If places is not an integer, it is truncated.
 
-      *                                    If places is nonnumeric, OCT2BIN returns the #VALUE!
 
-      *                                    error value.
 
-      *                                    If places is negative, OCT2BIN returns the #NUM! error
 
-      *                                    value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function OCTTOBIN($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) $x;
 
-         if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) {
 
-             return Functions::NAN();
 
-         }
 
-         return self::DECTOBIN(self::OCTTODEC($x), $places);
 
-     }
 
-     /**
 
-      * OCTTODEC.
 
-      *
 
-      * Return an octal value as decimal.
 
-      *
 
-      * Excel Function:
 
-      *        OCT2DEC(x)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The octal number you want to convert. Number may not contain
 
-      *                                more than 10 octal characters (30 bits). The most significant
 
-      *                                bit of number is the sign bit. The remaining 29 bits are
 
-      *                                magnitude bits. Negative numbers are represented using
 
-      *                                two's-complement notation.
 
-      *                                If number is not a valid octal number, OCT2DEC returns the
 
-      *                                #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function OCTTODEC($x)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         if (is_bool($x)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) $x;
 
-         if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) {
 
-             return Functions::NAN();
 
-         }
 
-         $binX = '';
 
-         foreach (str_split($x) as $char) {
 
-             $binX .= str_pad(decbin((int) $char), 3, '0', STR_PAD_LEFT);
 
-         }
 
-         if (strlen($binX) == 30 && $binX[0] == '1') {
 
-             for ($i = 0; $i < 30; ++$i) {
 
-                 $binX[$i] = ($binX[$i] == '1' ? '0' : '1');
 
-             }
 
-             return (bindec($binX) + 1) * -1;
 
-         }
 
-         return bindec($binX);
 
-     }
 
-     /**
 
-      * OCTTOHEX.
 
-      *
 
-      * Return an octal value as hex.
 
-      *
 
-      * Excel Function:
 
-      *        OCT2HEX(x[,places])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $x The octal number you want to convert. Number may not contain
 
-      *                                    more than 10 octal characters (30 bits). The most significant
 
-      *                                    bit of number is the sign bit. The remaining 29 bits are
 
-      *                                    magnitude bits. Negative numbers are represented using
 
-      *                                    two's-complement notation.
 
-      *                                    If number is negative, OCT2HEX ignores places and returns a
 
-      *                                    10-character hexadecimal number.
 
-      *                                    If number is not a valid octal number, OCT2HEX returns the
 
-      *                                    #NUM! error value.
 
-      *                                    If OCT2HEX requires more than places characters, it returns
 
-      *                                    the #NUM! error value.
 
-      * @param int $places The number of characters to use. If places is omitted, OCT2HEX
 
-      *                                    uses the minimum number of characters necessary. Places is useful
 
-      *                                    for padding the return value with leading 0s (zeros).
 
-      *                                    If places is not an integer, it is truncated.
 
-      *                                    If places is nonnumeric, OCT2HEX returns the #VALUE! error value.
 
-      *                                    If places is negative, OCT2HEX returns the #NUM! error value.
 
-      *
 
-      * @return string
 
-      */
 
-     public static function OCTTOHEX($x, $places = null)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         $places = Functions::flattenSingleValue($places);
 
-         if (is_bool($x)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $x = (string) $x;
 
-         if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) {
 
-             return Functions::NAN();
 
-         }
 
-         $hexVal = strtoupper(dechex(self::OCTTODEC($x)));
 
-         return self::nbrConversionFormat($hexVal, $places);
 
-     }
 
-     /**
 
-      * COMPLEX.
 
-      *
 
-      * Converts real and imaginary coefficients into a complex number of the form x +/- yi or x +/- yj.
 
-      *
 
-      * Excel Function:
 
-      *        COMPLEX(realNumber,imaginary[,suffix])
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param float $realNumber the real coefficient of the complex number
 
-      * @param float $imaginary the imaginary coefficient of the complex number
 
-      * @param string $suffix The suffix for the imaginary component of the complex number.
 
-      *                                        If omitted, the suffix is assumed to be "i".
 
-      *
 
-      * @return string
 
-      */
 
-     public static function COMPLEX($realNumber = 0.0, $imaginary = 0.0, $suffix = 'i')
 
-     {
 
-         $realNumber = ($realNumber === null) ? 0.0 : Functions::flattenSingleValue($realNumber);
 
-         $imaginary = ($imaginary === null) ? 0.0 : Functions::flattenSingleValue($imaginary);
 
-         $suffix = ($suffix === null) ? 'i' : Functions::flattenSingleValue($suffix);
 
-         if (((is_numeric($realNumber)) && (is_numeric($imaginary))) &&
 
-             (($suffix == 'i') || ($suffix == 'j') || ($suffix == ''))
 
-         ) {
 
-             $complex = new Complex($realNumber, $imaginary, $suffix);
 
-             return (string) $complex;
 
-         }
 
-         return Functions::VALUE();
 
-     }
 
-     /**
 
-      * IMAGINARY.
 
-      *
 
-      * Returns the imaginary coefficient of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMAGINARY(complexNumber)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the imaginary
 
-      *                                         coefficient
 
-      *
 
-      * @return float
 
-      */
 
-     public static function IMAGINARY($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (new Complex($complexNumber))->getImaginary();
 
-     }
 
-     /**
 
-      * IMREAL.
 
-      *
 
-      * Returns the real coefficient of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMREAL(complexNumber)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the real coefficient
 
-      *
 
-      * @return float
 
-      */
 
-     public static function IMREAL($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (new Complex($complexNumber))->getReal();
 
-     }
 
-     /**
 
-      * IMABS.
 
-      *
 
-      * Returns the absolute value (modulus) of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMABS(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the absolute value
 
-      *
 
-      * @return float
 
-      */
 
-     public static function IMABS($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (new Complex($complexNumber))->abs();
 
-     }
 
-     /**
 
-      * IMARGUMENT.
 
-      *
 
-      * Returns the argument theta of a complex number, i.e. the angle in radians from the real
 
-      * axis to the representation of the number in polar coordinates.
 
-      *
 
-      * Excel Function:
 
-      *        IMARGUMENT(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the argument theta
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMARGUMENT($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         $complex = new Complex($complexNumber);
 
-         if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) {
 
-             return Functions::DIV0();
 
-         }
 
-         return $complex->argument();
 
-     }
 
-     /**
 
-      * IMCONJUGATE.
 
-      *
 
-      * Returns the complex conjugate of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMCONJUGATE(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the conjugate
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMCONJUGATE($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->conjugate();
 
-     }
 
-     /**
 
-      * IMCOS.
 
-      *
 
-      * Returns the cosine of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMCOS(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the cosine
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMCOS($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->cos();
 
-     }
 
-     /**
 
-      * IMCOSH.
 
-      *
 
-      * Returns the hyperbolic cosine of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMCOSH(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the hyperbolic cosine
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMCOSH($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->cosh();
 
-     }
 
-     /**
 
-      * IMCOT.
 
-      *
 
-      * Returns the cotangent of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMCOT(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the cotangent
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMCOT($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->cot();
 
-     }
 
-     /**
 
-      * IMCSC.
 
-      *
 
-      * Returns the cosecant of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMCSC(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the cosecant
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMCSC($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->csc();
 
-     }
 
-     /**
 
-      * IMCSCH.
 
-      *
 
-      * Returns the hyperbolic cosecant of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMCSCH(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the hyperbolic cosecant
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMCSCH($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->csch();
 
-     }
 
-     /**
 
-      * IMSIN.
 
-      *
 
-      * Returns the sine of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMSIN(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the sine
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMSIN($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->sin();
 
-     }
 
-     /**
 
-      * IMSINH.
 
-      *
 
-      * Returns the hyperbolic sine of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMSINH(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the hyperbolic sine
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMSINH($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->sinh();
 
-     }
 
-     /**
 
-      * IMSEC.
 
-      *
 
-      * Returns the secant of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMSEC(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the secant
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMSEC($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->sec();
 
-     }
 
-     /**
 
-      * IMSECH.
 
-      *
 
-      * Returns the hyperbolic secant of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMSECH(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the hyperbolic secant
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMSECH($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->sech();
 
-     }
 
-     /**
 
-      * IMTAN.
 
-      *
 
-      * Returns the tangent of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMTAN(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the tangent
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function IMTAN($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->tan();
 
-     }
 
-     /**
 
-      * IMSQRT.
 
-      *
 
-      * Returns the square root of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMSQRT(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the square root
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMSQRT($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         $theta = self::IMARGUMENT($complexNumber);
 
-         if ($theta === Functions::DIV0()) {
 
-             return '0';
 
-         }
 
-         return (string) (new Complex($complexNumber))->sqrt();
 
-     }
 
-     /**
 
-      * IMLN.
 
-      *
 
-      * Returns the natural logarithm of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMLN(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the natural logarithm
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMLN($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         $complex = new Complex($complexNumber);
 
-         if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) {
 
-             return Functions::NAN();
 
-         }
 
-         return (string) (new Complex($complexNumber))->ln();
 
-     }
 
-     /**
 
-      * IMLOG10.
 
-      *
 
-      * Returns the common logarithm (base 10) of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMLOG10(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the common logarithm
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMLOG10($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         $complex = new Complex($complexNumber);
 
-         if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) {
 
-             return Functions::NAN();
 
-         }
 
-         return (string) (new Complex($complexNumber))->log10();
 
-     }
 
-     /**
 
-      * IMLOG2.
 
-      *
 
-      * Returns the base-2 logarithm of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMLOG2(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the base-2 logarithm
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMLOG2($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         $complex = new Complex($complexNumber);
 
-         if ($complex->getReal() == 0.0 && $complex->getImaginary() == 0.0) {
 
-             return Functions::NAN();
 
-         }
 
-         return (string) (new Complex($complexNumber))->log2();
 
-     }
 
-     /**
 
-      * IMEXP.
 
-      *
 
-      * Returns the exponential of a complex number in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMEXP(complexNumber)
 
-      *
 
-      * @param string $complexNumber the complex number for which you want the exponential
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMEXP($complexNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         return (string) (new Complex($complexNumber))->exp();
 
-     }
 
-     /**
 
-      * IMPOWER.
 
-      *
 
-      * Returns a complex number in x + yi or x + yj text format raised to a power.
 
-      *
 
-      * Excel Function:
 
-      *        IMPOWER(complexNumber,realNumber)
 
-      *
 
-      * @param string $complexNumber the complex number you want to raise to a power
 
-      * @param float $realNumber the power to which you want to raise the complex number
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMPOWER($complexNumber, $realNumber)
 
-     {
 
-         $complexNumber = Functions::flattenSingleValue($complexNumber);
 
-         $realNumber = Functions::flattenSingleValue($realNumber);
 
-         if (!is_numeric($realNumber)) {
 
-             return Functions::VALUE();
 
-         }
 
-         return (string) (new Complex($complexNumber))->pow($realNumber);
 
-     }
 
-     /**
 
-      * IMDIV.
 
-      *
 
-      * Returns the quotient of two complex numbers in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMDIV(complexDividend,complexDivisor)
 
-      *
 
-      * @param string $complexDividend the complex numerator or dividend
 
-      * @param string $complexDivisor the complex denominator or divisor
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMDIV($complexDividend, $complexDivisor)
 
-     {
 
-         $complexDividend = Functions::flattenSingleValue($complexDividend);
 
-         $complexDivisor = Functions::flattenSingleValue($complexDivisor);
 
-         try {
 
-             return (string) (new Complex($complexDividend))->divideby(new Complex($complexDivisor));
 
-         } catch (ComplexException $e) {
 
-             return Functions::NAN();
 
-         }
 
-     }
 
-     /**
 
-      * IMSUB.
 
-      *
 
-      * Returns the difference of two complex numbers in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMSUB(complexNumber1,complexNumber2)
 
-      *
 
-      * @param string $complexNumber1 the complex number from which to subtract complexNumber2
 
-      * @param string $complexNumber2 the complex number to subtract from complexNumber1
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMSUB($complexNumber1, $complexNumber2)
 
-     {
 
-         $complexNumber1 = Functions::flattenSingleValue($complexNumber1);
 
-         $complexNumber2 = Functions::flattenSingleValue($complexNumber2);
 
-         try {
 
-             return (string) (new Complex($complexNumber1))->subtract(new Complex($complexNumber2));
 
-         } catch (ComplexException $e) {
 
-             return Functions::NAN();
 
-         }
 
-     }
 
-     /**
 
-      * IMSUM.
 
-      *
 
-      * Returns the sum of two or more complex numbers in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMSUM(complexNumber[,complexNumber[,...]])
 
-      *
 
-      * @param string ...$complexNumbers Series of complex numbers to add
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMSUM(...$complexNumbers)
 
-     {
 
-         // Return value
 
-         $returnValue = new Complex(0.0);
 
-         $aArgs = Functions::flattenArray($complexNumbers);
 
-         try {
 
-             // Loop through the arguments
 
-             foreach ($aArgs as $complex) {
 
-                 $returnValue = $returnValue->add(new Complex($complex));
 
-             }
 
-         } catch (ComplexException $e) {
 
-             return Functions::NAN();
 
-         }
 
-         return (string) $returnValue;
 
-     }
 
-     /**
 
-      * IMPRODUCT.
 
-      *
 
-      * Returns the product of two or more complex numbers in x + yi or x + yj text format.
 
-      *
 
-      * Excel Function:
 
-      *        IMPRODUCT(complexNumber[,complexNumber[,...]])
 
-      *
 
-      * @param string ...$complexNumbers Series of complex numbers to multiply
 
-      *
 
-      * @return string
 
-      */
 
-     public static function IMPRODUCT(...$complexNumbers)
 
-     {
 
-         // Return value
 
-         $returnValue = new Complex(1.0);
 
-         $aArgs = Functions::flattenArray($complexNumbers);
 
-         try {
 
-             // Loop through the arguments
 
-             foreach ($aArgs as $complex) {
 
-                 $returnValue = $returnValue->multiply(new Complex($complex));
 
-             }
 
-         } catch (ComplexException $e) {
 
-             return Functions::NAN();
 
-         }
 
-         return (string) $returnValue;
 
-     }
 
-     /**
 
-      * DELTA.
 
-      *
 
-      * Tests whether two values are equal. Returns 1 if number1 = number2; returns 0 otherwise.
 
-      *    Use this function to filter a set of values. For example, by summing several DELTA
 
-      *    functions you calculate the count of equal pairs. This function is also known as the
 
-      * Kronecker Delta function.
 
-      *
 
-      *    Excel Function:
 
-      *        DELTA(a[,b])
 
-      *
 
-      * @param float $a the first number
 
-      * @param float $b The second number. If omitted, b is assumed to be zero.
 
-      *
 
-      * @return int
 
-      */
 
-     public static function DELTA($a, $b = 0)
 
-     {
 
-         $a = Functions::flattenSingleValue($a);
 
-         $b = Functions::flattenSingleValue($b);
 
-         return (int) ($a == $b);
 
-     }
 
-     /**
 
-      * GESTEP.
 
-      *
 
-      *    Excel Function:
 
-      *        GESTEP(number[,step])
 
-      *
 
-      *    Returns 1 if number >= step; returns 0 (zero) otherwise
 
-      *    Use this function to filter a set of values. For example, by summing several GESTEP
 
-      * functions you calculate the count of values that exceed a threshold.
 
-      *
 
-      * @param float $number the value to test against step
 
-      * @param float $step The threshold value.
 
-      *                                    If you omit a value for step, GESTEP uses zero.
 
-      *
 
-      * @return int
 
-      */
 
-     public static function GESTEP($number, $step = 0)
 
-     {
 
-         $number = Functions::flattenSingleValue($number);
 
-         $step = Functions::flattenSingleValue($step);
 
-         return (int) ($number >= $step);
 
-     }
 
-     //
 
-     //    Private method to calculate the erf value
 
-     //
 
-     private static $twoSqrtPi = 1.128379167095512574;
 
-     public static function erfVal($x)
 
-     {
 
-         if (abs($x) > 2.2) {
 
-             return 1 - self::erfcVal($x);
 
-         }
 
-         $sum = $term = $x;
 
-         $xsqr = ($x * $x);
 
-         $j = 1;
 
-         do {
 
-             $term *= $xsqr / $j;
 
-             $sum -= $term / (2 * $j + 1);
 
-             ++$j;
 
-             $term *= $xsqr / $j;
 
-             $sum += $term / (2 * $j + 1);
 
-             ++$j;
 
-             if ($sum == 0.0) {
 
-                 break;
 
-             }
 
-         } while (abs($term / $sum) > Functions::PRECISION);
 
-         return self::$twoSqrtPi * $sum;
 
-     }
 
-     /**
 
-      * Validate arguments passed to the bitwise functions.
 
-      *
 
-      * @param mixed $value
 
-      *
 
-      * @throws Exception
 
-      *
 
-      * @return int
 
-      */
 
-     private static function validateBitwiseArgument($value)
 
-     {
 
-         $value = Functions::flattenSingleValue($value);
 
-         if (is_int($value)) {
 
-             return $value;
 
-         } elseif (is_numeric($value)) {
 
-             if ($value == (int) ($value)) {
 
-                 $value = (int) ($value);
 
-                 if (($value > pow(2, 48) - 1) || ($value < 0)) {
 
-                     throw new Exception(Functions::NAN());
 
-                 }
 
-                 return $value;
 
-             }
 
-             throw new Exception(Functions::NAN());
 
-         }
 
-         throw new Exception(Functions::VALUE());
 
-     }
 
-     /**
 
-      * BITAND.
 
-      *
 
-      * Returns the bitwise AND of two integer values.
 
-      *
 
-      * Excel Function:
 
-      *        BITAND(number1, number2)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param int $number1
 
-      * @param int $number2
 
-      *
 
-      * @return int|string
 
-      */
 
-     public static function BITAND($number1, $number2)
 
-     {
 
-         try {
 
-             $number1 = self::validateBitwiseArgument($number1);
 
-             $number2 = self::validateBitwiseArgument($number2);
 
-         } catch (Exception $e) {
 
-             return $e->getMessage();
 
-         }
 
-         return $number1 & $number2;
 
-     }
 
-     /**
 
-      * BITOR.
 
-      *
 
-      * Returns the bitwise OR of two integer values.
 
-      *
 
-      * Excel Function:
 
-      *        BITOR(number1, number2)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param int $number1
 
-      * @param int $number2
 
-      *
 
-      * @return int|string
 
-      */
 
-     public static function BITOR($number1, $number2)
 
-     {
 
-         try {
 
-             $number1 = self::validateBitwiseArgument($number1);
 
-             $number2 = self::validateBitwiseArgument($number2);
 
-         } catch (Exception $e) {
 
-             return $e->getMessage();
 
-         }
 
-         return $number1 | $number2;
 
-     }
 
-     /**
 
-      * BITXOR.
 
-      *
 
-      * Returns the bitwise XOR of two integer values.
 
-      *
 
-      * Excel Function:
 
-      *        BITXOR(number1, number2)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param int $number1
 
-      * @param int $number2
 
-      *
 
-      * @return int|string
 
-      */
 
-     public static function BITXOR($number1, $number2)
 
-     {
 
-         try {
 
-             $number1 = self::validateBitwiseArgument($number1);
 
-             $number2 = self::validateBitwiseArgument($number2);
 
-         } catch (Exception $e) {
 
-             return $e->getMessage();
 
-         }
 
-         return $number1 ^ $number2;
 
-     }
 
-     /**
 
-      * BITLSHIFT.
 
-      *
 
-      * Returns the number value shifted left by shift_amount bits.
 
-      *
 
-      * Excel Function:
 
-      *        BITLSHIFT(number, shift_amount)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param int $number
 
-      * @param int $shiftAmount
 
-      *
 
-      * @return int|string
 
-      */
 
-     public static function BITLSHIFT($number, $shiftAmount)
 
-     {
 
-         try {
 
-             $number = self::validateBitwiseArgument($number);
 
-         } catch (Exception $e) {
 
-             return $e->getMessage();
 
-         }
 
-         $shiftAmount = Functions::flattenSingleValue($shiftAmount);
 
-         $result = $number << $shiftAmount;
 
-         if ($result > pow(2, 48) - 1) {
 
-             return Functions::NAN();
 
-         }
 
-         return $result;
 
-     }
 
-     /**
 
-      * BITRSHIFT.
 
-      *
 
-      * Returns the number value shifted right by shift_amount bits.
 
-      *
 
-      * Excel Function:
 
-      *        BITRSHIFT(number, shift_amount)
 
-      *
 
-      * @category Engineering Functions
 
-      *
 
-      * @param int $number
 
-      * @param int $shiftAmount
 
-      *
 
-      * @return int|string
 
-      */
 
-     public static function BITRSHIFT($number, $shiftAmount)
 
-     {
 
-         try {
 
-             $number = self::validateBitwiseArgument($number);
 
-         } catch (Exception $e) {
 
-             return $e->getMessage();
 
-         }
 
-         $shiftAmount = Functions::flattenSingleValue($shiftAmount);
 
-         return $number >> $shiftAmount;
 
-     }
 
-     /**
 
-      * ERF.
 
-      *
 
-      * Returns the error function integrated between the lower and upper bound arguments.
 
-      *
 
-      *    Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments,
 
-      *            the function would return a #NUM! error. However, in Excel 2010, the function algorithm was
 
-      *            improved, so that it can now calculate the function for both positive and negative ranges.
 
-      *            PhpSpreadsheet follows Excel 2010 behaviour, and accepts negative arguments.
 
-      *
 
-      *    Excel Function:
 
-      *        ERF(lower[,upper])
 
-      *
 
-      * @param float $lower lower bound for integrating ERF
 
-      * @param float $upper upper bound for integrating ERF.
 
-      *                                If omitted, ERF integrates between zero and lower_limit
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function ERF($lower, $upper = null)
 
-     {
 
-         $lower = Functions::flattenSingleValue($lower);
 
-         $upper = Functions::flattenSingleValue($upper);
 
-         if (is_numeric($lower)) {
 
-             if ($upper === null) {
 
-                 return self::erfVal($lower);
 
-             }
 
-             if (is_numeric($upper)) {
 
-                 return self::erfVal($upper) - self::erfVal($lower);
 
-             }
 
-         }
 
-         return Functions::VALUE();
 
-     }
 
-     /**
 
-      * ERFPRECISE.
 
-      *
 
-      * Returns the error function integrated between the lower and upper bound arguments.
 
-      *
 
-      *    Excel Function:
 
-      *        ERF.PRECISE(limit)
 
-      *
 
-      * @param float $limit bound for integrating ERF
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function ERFPRECISE($limit)
 
-     {
 
-         $limit = Functions::flattenSingleValue($limit);
 
-         return self::ERF($limit);
 
-     }
 
-     //
 
-     //    Private method to calculate the erfc value
 
-     //
 
-     private static $oneSqrtPi = 0.564189583547756287;
 
-     private static function erfcVal($x)
 
-     {
 
-         if (abs($x) < 2.2) {
 
-             return 1 - self::erfVal($x);
 
-         }
 
-         if ($x < 0) {
 
-             return 2 - self::ERFC(-$x);
 
-         }
 
-         $a = $n = 1;
 
-         $b = $c = $x;
 
-         $d = ($x * $x) + 0.5;
 
-         $q1 = $q2 = $b / $d;
 
-         $t = 0;
 
-         do {
 
-             $t = $a * $n + $b * $x;
 
-             $a = $b;
 
-             $b = $t;
 
-             $t = $c * $n + $d * $x;
 
-             $c = $d;
 
-             $d = $t;
 
-             $n += 0.5;
 
-             $q1 = $q2;
 
-             $q2 = $b / $d;
 
-         } while ((abs($q1 - $q2) / $q2) > Functions::PRECISION);
 
-         return self::$oneSqrtPi * exp(-$x * $x) * $q2;
 
-     }
 
-     /**
 
-      * ERFC.
 
-      *
 
-      *    Returns the complementary ERF function integrated between x and infinity
 
-      *
 
-      *    Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument,
 
-      *        the function would return a #NUM! error. However, in Excel 2010, the function algorithm was
 
-      *        improved, so that it can now calculate the function for both positive and negative x values.
 
-      *            PhpSpreadsheet follows Excel 2010 behaviour, and accepts nagative arguments.
 
-      *
 
-      *    Excel Function:
 
-      *        ERFC(x)
 
-      *
 
-      * @param float $x The lower bound for integrating ERFC
 
-      *
 
-      * @return float|string
 
-      */
 
-     public static function ERFC($x)
 
-     {
 
-         $x = Functions::flattenSingleValue($x);
 
-         if (is_numeric($x)) {
 
-             return self::erfcVal($x);
 
-         }
 
-         return Functions::VALUE();
 
-     }
 
-     /**
 
-      *    getConversionGroups
 
-      * Returns a list of the different conversion groups for UOM conversions.
 
-      *
 
-      * @return array
 
-      */
 
-     public static function getConversionGroups()
 
-     {
 
-         $conversionGroups = [];
 
-         foreach (self::$conversionUnits as $conversionUnit) {
 
-             $conversionGroups[] = $conversionUnit['Group'];
 
-         }
 
-         return array_merge(array_unique($conversionGroups));
 
-     }
 
-     /**
 
-      *    getConversionGroupUnits
 
-      * Returns an array of units of measure, for a specified conversion group, or for all groups.
 
-      *
 
-      * @param string $group The group whose units of measure you want to retrieve
 
-      *
 
-      * @return array
 
-      */
 
-     public static function getConversionGroupUnits($group = null)
 
-     {
 
-         $conversionGroups = [];
 
-         foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) {
 
-             if (($group === null) || ($conversionGroup['Group'] == $group)) {
 
-                 $conversionGroups[$conversionGroup['Group']][] = $conversionUnit;
 
-             }
 
-         }
 
-         return $conversionGroups;
 
-     }
 
-     /**
 
-      * getConversionGroupUnitDetails.
 
-      *
 
-      * @param string $group The group whose units of measure you want to retrieve
 
-      *
 
-      * @return array
 
-      */
 
-     public static function getConversionGroupUnitDetails($group = null)
 
-     {
 
-         $conversionGroups = [];
 
-         foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) {
 
-             if (($group === null) || ($conversionGroup['Group'] == $group)) {
 
-                 $conversionGroups[$conversionGroup['Group']][] = [
 
-                     'unit' => $conversionUnit,
 
-                     'description' => $conversionGroup['Unit Name'],
 
-                 ];
 
-             }
 
-         }
 
-         return $conversionGroups;
 
-     }
 
-     /**
 
-      *    getConversionMultipliers
 
-      * Returns an array of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM().
 
-      *
 
-      * @return array of mixed
 
-      */
 
-     public static function getConversionMultipliers()
 
-     {
 
-         return self::$conversionMultipliers;
 
-     }
 
-     /**
 
-      * CONVERTUOM.
 
-      *
 
-      * Converts a number from one measurement system to another.
 
-      *    For example, CONVERT can translate a table of distances in miles to a table of distances
 
-      * in kilometers.
 
-      *
 
-      *    Excel Function:
 
-      *        CONVERT(value,fromUOM,toUOM)
 
-      *
 
-      * @param float $value the value in fromUOM to convert
 
-      * @param string $fromUOM the units for value
 
-      * @param string $toUOM the units for the result
 
-      *
 
-      * @return float
 
-      */
 
-     public static function CONVERTUOM($value, $fromUOM, $toUOM)
 
-     {
 
-         $value = Functions::flattenSingleValue($value);
 
-         $fromUOM = Functions::flattenSingleValue($fromUOM);
 
-         $toUOM = Functions::flattenSingleValue($toUOM);
 
-         if (!is_numeric($value)) {
 
-             return Functions::VALUE();
 
-         }
 
-         $fromMultiplier = 1.0;
 
-         if (isset(self::$conversionUnits[$fromUOM])) {
 
-             $unitGroup1 = self::$conversionUnits[$fromUOM]['Group'];
 
-         } else {
 
-             $fromMultiplier = substr($fromUOM, 0, 1);
 
-             $fromUOM = substr($fromUOM, 1);
 
-             if (isset(self::$conversionMultipliers[$fromMultiplier])) {
 
-                 $fromMultiplier = self::$conversionMultipliers[$fromMultiplier]['multiplier'];
 
-             } else {
 
-                 return Functions::NA();
 
-             }
 
-             if ((isset(self::$conversionUnits[$fromUOM])) && (self::$conversionUnits[$fromUOM]['AllowPrefix'])) {
 
-                 $unitGroup1 = self::$conversionUnits[$fromUOM]['Group'];
 
-             } else {
 
-                 return Functions::NA();
 
-             }
 
-         }
 
-         $value *= $fromMultiplier;
 
-         $toMultiplier = 1.0;
 
-         if (isset(self::$conversionUnits[$toUOM])) {
 
-             $unitGroup2 = self::$conversionUnits[$toUOM]['Group'];
 
-         } else {
 
-             $toMultiplier = substr($toUOM, 0, 1);
 
-             $toUOM = substr($toUOM, 1);
 
-             if (isset(self::$conversionMultipliers[$toMultiplier])) {
 
-                 $toMultiplier = self::$conversionMultipliers[$toMultiplier]['multiplier'];
 
-             } else {
 
-                 return Functions::NA();
 
-             }
 
-             if ((isset(self::$conversionUnits[$toUOM])) && (self::$conversionUnits[$toUOM]['AllowPrefix'])) {
 
-                 $unitGroup2 = self::$conversionUnits[$toUOM]['Group'];
 
-             } else {
 
-                 return Functions::NA();
 
-             }
 
-         }
 
-         if ($unitGroup1 != $unitGroup2) {
 
-             return Functions::NA();
 
-         }
 
-         if (($fromUOM == $toUOM) && ($fromMultiplier == $toMultiplier)) {
 
-             //    We've already factored $fromMultiplier into the value, so we need
 
-             //        to reverse it again
 
-             return $value / $fromMultiplier;
 
-         } elseif ($unitGroup1 == 'Temperature') {
 
-             if (($fromUOM == 'F') || ($fromUOM == 'fah')) {
 
-                 if (($toUOM == 'F') || ($toUOM == 'fah')) {
 
-                     return $value;
 
-                 }
 
-                 $value = (($value - 32) / 1.8);
 
-                 if (($toUOM == 'K') || ($toUOM == 'kel')) {
 
-                     $value += 273.15;
 
-                 }
 
-                 return $value;
 
-             } elseif ((($fromUOM == 'K') || ($fromUOM == 'kel')) &&
 
-                 (($toUOM == 'K') || ($toUOM == 'kel'))
 
-             ) {
 
-                 return $value;
 
-             } elseif ((($fromUOM == 'C') || ($fromUOM == 'cel')) &&
 
-                 (($toUOM == 'C') || ($toUOM == 'cel'))
 
-             ) {
 
-                 return $value;
 
-             }
 
-             if (($toUOM == 'F') || ($toUOM == 'fah')) {
 
-                 if (($fromUOM == 'K') || ($fromUOM == 'kel')) {
 
-                     $value -= 273.15;
 
-                 }
 
-                 return ($value * 1.8) + 32;
 
-             }
 
-             if (($toUOM == 'C') || ($toUOM == 'cel')) {
 
-                 return $value - 273.15;
 
-             }
 
-             return $value + 273.15;
 
-         }
 
-         return ($value * self::$unitConversions[$unitGroup1][$fromUOM][$toUOM]) / $toMultiplier;
 
-     }
 
- }
 
 
  |