PageRenderTime 58ms CodeModel.GetById 13ms app.highlight 34ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/phpexcel/PHPExcel/Calculation/Engineering.php

https://bitbucket.org/synergylearning/campusconnect
PHP | 2502 lines | 1496 code | 212 blank | 794 comment | 317 complexity | 3ae4a824f952526760171a0800bbf357 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

   1<?php
   2/**
   3 * PHPExcel
   4 *
   5 * Copyright (c) 2006 - 2012 PHPExcel
   6 *
   7 * This library is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU Lesser General Public
   9 * License as published by the Free Software Foundation; either
  10 * version 2.1 of the License, or (at your option) any later version.
  11 *
  12 * This library is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15 * Lesser General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU Lesser General Public
  18 * License along with this library; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20 *
  21 * @category	PHPExcel
  22 * @package		PHPExcel_Calculation
  23 * @copyright	Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
  24 * @license		http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
  25 * @version		##VERSION##, ##DATE##
  26 */
  27
  28
  29/** PHPExcel root directory */
  30if (!defined('PHPEXCEL_ROOT')) {
  31	/**
  32	 * @ignore
  33	 */
  34	define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../');
  35	require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
  36}
  37
  38
  39/** EULER */
  40define('EULER', 2.71828182845904523536);
  41
  42
  43/**
  44 * PHPExcel_Calculation_Engineering
  45 *
  46 * @category	PHPExcel
  47 * @package		PHPExcel_Calculation
  48 * @copyright	Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
  49 */
  50class PHPExcel_Calculation_Engineering {
  51
  52	/**
  53	 * Details of the Units of measure that can be used in CONVERTUOM()
  54	 *
  55	 * @var mixed[]
  56	 */
  57	private static $_conversionUnits = array( 'g'		=> array(	'Group'	=> 'Mass',			'Unit Name'	=> 'Gram',						'AllowPrefix'	=> True		),
  58											  'sg'		=> array(	'Group'	=> 'Mass',			'Unit Name'	=> 'Slug',						'AllowPrefix'	=> False	),
  59											  'lbm'		=> array(	'Group'	=> 'Mass',			'Unit Name'	=> 'Pound mass (avoirdupois)',	'AllowPrefix'	=> False	),
  60											  'u'		=> array(	'Group'	=> 'Mass',			'Unit Name'	=> 'U (atomic mass unit)',		'AllowPrefix'	=> True		),
  61											  'ozm'		=> array(	'Group'	=> 'Mass',			'Unit Name'	=> 'Ounce mass (avoirdupois)',	'AllowPrefix'	=> False	),
  62											  'm'		=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Meter',						'AllowPrefix'	=> True		),
  63											  'mi'		=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Statute mile',				'AllowPrefix'	=> False	),
  64											  'Nmi'		=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Nautical mile',				'AllowPrefix'	=> False	),
  65											  'in'		=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Inch',						'AllowPrefix'	=> False	),
  66											  'ft'		=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Foot',						'AllowPrefix'	=> False	),
  67											  'yd'		=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Yard',						'AllowPrefix'	=> False	),
  68											  'ang'		=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Angstrom',					'AllowPrefix'	=> True		),
  69											  'Pica'	=> array(	'Group'	=> 'Distance',		'Unit Name'	=> 'Pica (1/72 in)',			'AllowPrefix'	=> False	),
  70											  'yr'		=> array(	'Group'	=> 'Time',			'Unit Name'	=> 'Year',						'AllowPrefix'	=> False	),
  71											  'day'		=> array(	'Group'	=> 'Time',			'Unit Name'	=> 'Day',						'AllowPrefix'	=> False	),
  72											  'hr'		=> array(	'Group'	=> 'Time',			'Unit Name'	=> 'Hour',						'AllowPrefix'	=> False	),
  73											  'mn'		=> array(	'Group'	=> 'Time',			'Unit Name'	=> 'Minute',					'AllowPrefix'	=> False	),
  74											  'sec'		=> array(	'Group'	=> 'Time',			'Unit Name'	=> 'Second',					'AllowPrefix'	=> True		),
  75											  'Pa'		=> array(	'Group'	=> 'Pressure',		'Unit Name'	=> 'Pascal',					'AllowPrefix'	=> True		),
  76											  'p'		=> array(	'Group'	=> 'Pressure',		'Unit Name'	=> 'Pascal',					'AllowPrefix'	=> True		),
  77											  'atm'		=> array(	'Group'	=> 'Pressure',		'Unit Name'	=> 'Atmosphere',				'AllowPrefix'	=> True		),
  78											  'at'		=> array(	'Group'	=> 'Pressure',		'Unit Name'	=> 'Atmosphere',				'AllowPrefix'	=> True		),
  79											  'mmHg'	=> array(	'Group'	=> 'Pressure',		'Unit Name'	=> 'mm of Mercury',				'AllowPrefix'	=> True		),
  80											  'N'		=> array(	'Group'	=> 'Force',			'Unit Name'	=> 'Newton',					'AllowPrefix'	=> True		),
  81											  'dyn'		=> array(	'Group'	=> 'Force',			'Unit Name'	=> 'Dyne',						'AllowPrefix'	=> True		),
  82											  'dy'		=> array(	'Group'	=> 'Force',			'Unit Name'	=> 'Dyne',						'AllowPrefix'	=> True		),
  83											  'lbf'		=> array(	'Group'	=> 'Force',			'Unit Name'	=> 'Pound force',				'AllowPrefix'	=> False	),
  84											  'J'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Joule',						'AllowPrefix'	=> True		),
  85											  'e'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Erg',						'AllowPrefix'	=> True		),
  86											  'c'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Thermodynamic calorie',		'AllowPrefix'	=> True		),
  87											  'cal'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'IT calorie',				'AllowPrefix'	=> True		),
  88											  'eV'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Electron volt',				'AllowPrefix'	=> True		),
  89											  'ev'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Electron volt',				'AllowPrefix'	=> True		),
  90											  'HPh'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Horsepower-hour',			'AllowPrefix'	=> False	),
  91											  'hh'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Horsepower-hour',			'AllowPrefix'	=> False	),
  92											  'Wh'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Watt-hour',					'AllowPrefix'	=> True		),
  93											  'wh'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Watt-hour',					'AllowPrefix'	=> True		),
  94											  'flb'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'Foot-pound',				'AllowPrefix'	=> False	),
  95											  'BTU'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'BTU',						'AllowPrefix'	=> False	),
  96											  'btu'		=> array(	'Group'	=> 'Energy',		'Unit Name'	=> 'BTU',						'AllowPrefix'	=> False	),
  97											  'HP'		=> array(	'Group'	=> 'Power',			'Unit Name'	=> 'Horsepower',				'AllowPrefix'	=> False	),
  98											  'h'		=> array(	'Group'	=> 'Power',			'Unit Name'	=> 'Horsepower',				'AllowPrefix'	=> False	),
  99											  'W'		=> array(	'Group'	=> 'Power',			'Unit Name'	=> 'Watt',						'AllowPrefix'	=> True		),
 100											  'w'		=> array(	'Group'	=> 'Power',			'Unit Name'	=> 'Watt',						'AllowPrefix'	=> True		),
 101											  'T'		=> array(	'Group'	=> 'Magnetism',		'Unit Name'	=> 'Tesla',						'AllowPrefix'	=> True		),
 102											  'ga'		=> array(	'Group'	=> 'Magnetism',		'Unit Name'	=> 'Gauss',						'AllowPrefix'	=> True		),
 103											  'C'		=> array(	'Group'	=> 'Temperature',	'Unit Name'	=> 'Celsius',					'AllowPrefix'	=> False	),
 104											  'cel'		=> array(	'Group'	=> 'Temperature',	'Unit Name'	=> 'Celsius',					'AllowPrefix'	=> False	),
 105											  'F'		=> array(	'Group'	=> 'Temperature',	'Unit Name'	=> 'Fahrenheit',				'AllowPrefix'	=> False	),
 106											  'fah'		=> array(	'Group'	=> 'Temperature',	'Unit Name'	=> 'Fahrenheit',				'AllowPrefix'	=> False	),
 107											  'K'		=> array(	'Group'	=> 'Temperature',	'Unit Name'	=> 'Kelvin',					'AllowPrefix'	=> False	),
 108											  'kel'		=> array(	'Group'	=> 'Temperature',	'Unit Name'	=> 'Kelvin',					'AllowPrefix'	=> False	),
 109											  'tsp'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Teaspoon',					'AllowPrefix'	=> False	),
 110											  'tbs'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Tablespoon',				'AllowPrefix'	=> False	),
 111											  'oz'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Fluid Ounce',				'AllowPrefix'	=> False	),
 112											  'cup'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Cup',						'AllowPrefix'	=> False	),
 113											  'pt'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'U.S. Pint',					'AllowPrefix'	=> False	),
 114											  'us_pt'	=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'U.S. Pint',					'AllowPrefix'	=> False	),
 115											  'uk_pt'	=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'U.K. Pint',					'AllowPrefix'	=> False	),
 116											  'qt'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Quart',						'AllowPrefix'	=> False	),
 117											  'gal'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Gallon',					'AllowPrefix'	=> False	),
 118											  'l'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Litre',						'AllowPrefix'	=> True		),
 119											  'lt'		=> array(	'Group'	=> 'Liquid',		'Unit Name'	=> 'Litre',						'AllowPrefix'	=> True		)
 120											);
 121
 122	/**
 123	 * Details of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM()
 124	 *
 125	 * @var mixed[]
 126	 */
 127	private static $_conversionMultipliers = array(	'Y'	=> array(	'multiplier'	=> 1E24,	'name'	=> 'yotta'	),
 128													'Z'	=> array(	'multiplier'	=> 1E21,	'name'	=> 'zetta'	),
 129													'E'	=> array(	'multiplier'	=> 1E18,	'name'	=> 'exa'	),
 130													'P'	=> array(	'multiplier'	=> 1E15,	'name'	=> 'peta'	),
 131													'T'	=> array(	'multiplier'	=> 1E12,	'name'	=> 'tera'	),
 132													'G'	=> array(	'multiplier'	=> 1E9,		'name'	=> 'giga'	),
 133													'M'	=> array(	'multiplier'	=> 1E6,		'name'	=> 'mega'	),
 134													'k'	=> array(	'multiplier'	=> 1E3,		'name'	=> 'kilo'	),
 135													'h'	=> array(	'multiplier'	=> 1E2,		'name'	=> 'hecto'	),
 136													'e'	=> array(	'multiplier'	=> 1E1,		'name'	=> 'deka'	),
 137													'd'	=> array(	'multiplier'	=> 1E-1,	'name'	=> 'deci'	),
 138													'c'	=> array(	'multiplier'	=> 1E-2,	'name'	=> 'centi'	),
 139													'm'	=> array(	'multiplier'	=> 1E-3,	'name'	=> 'milli'	),
 140													'u'	=> array(	'multiplier'	=> 1E-6,	'name'	=> 'micro'	),
 141													'n'	=> array(	'multiplier'	=> 1E-9,	'name'	=> 'nano'	),
 142													'p'	=> array(	'multiplier'	=> 1E-12,	'name'	=> 'pico'	),
 143													'f'	=> array(	'multiplier'	=> 1E-15,	'name'	=> 'femto'	),
 144													'a'	=> array(	'multiplier'	=> 1E-18,	'name'	=> 'atto'	),
 145													'z'	=> array(	'multiplier'	=> 1E-21,	'name'	=> 'zepto'	),
 146													'y'	=> array(	'multiplier'	=> 1E-24,	'name'	=> 'yocto'	)
 147												 );
 148
 149	/**
 150	 * Details of the Units of measure conversion factors, organised by group
 151	 *
 152	 * @var mixed[]
 153	 */
 154	private static $_unitConversions = array(	'Mass'		=> array(	'g'		=> array(	'g'		=> 1.0,
 155																							'sg'	=> 6.85220500053478E-05,
 156																							'lbm'	=> 2.20462291469134E-03,
 157																							'u'		=> 6.02217000000000E+23,
 158																							'ozm'	=> 3.52739718003627E-02
 159																						),
 160																		'sg'	=> array(	'g'		=> 1.45938424189287E+04,
 161																							'sg'	=> 1.0,
 162																							'lbm'	=> 3.21739194101647E+01,
 163																							'u'		=> 8.78866000000000E+27,
 164																							'ozm'	=> 5.14782785944229E+02
 165																						),
 166																		'lbm'	=> array(	'g'		=> 4.5359230974881148E+02,
 167																							'sg'	=> 3.10810749306493E-02,
 168																							'lbm'	=> 1.0,
 169																							'u'		=> 2.73161000000000E+26,
 170																							'ozm'	=> 1.60000023429410E+01
 171																						),
 172																		'u'		=> array(	'g'		=> 1.66053100460465E-24,
 173																							'sg'	=> 1.13782988532950E-28,
 174																							'lbm'	=> 3.66084470330684E-27,
 175																							'u'		=> 1.0,
 176																							'ozm'	=> 5.85735238300524E-26
 177																						),
 178																		'ozm'	=> array(	'g'		=> 2.83495152079732E+01,
 179																							'sg'	=> 1.94256689870811E-03,
 180																							'lbm'	=> 6.24999908478882E-02,
 181																							'u'		=> 1.70725600000000E+25,
 182																							'ozm'	=> 1.0
 183																						)
 184																	),
 185												'Distance'	=> array(	'm'		=> array(	'm'		=> 1.0,
 186																							'mi'	=> 6.21371192237334E-04,
 187																							'Nmi'	=> 5.39956803455724E-04,
 188																							'in'	=> 3.93700787401575E+01,
 189																							'ft'	=> 3.28083989501312E+00,
 190																							'yd'	=> 1.09361329797891E+00,
 191																							'ang'	=> 1.00000000000000E+10,
 192																							'Pica'	=> 2.83464566929116E+03
 193																						),
 194																		'mi'	=> array(	'm'		=> 1.60934400000000E+03,
 195																							'mi'	=> 1.0,
 196																							'Nmi'	=> 8.68976241900648E-01,
 197																							'in'	=> 6.33600000000000E+04,
 198																							'ft'	=> 5.28000000000000E+03,
 199																							'yd'	=> 1.76000000000000E+03,
 200																							'ang'	=> 1.60934400000000E+13,
 201																							'Pica'	=> 4.56191999999971E+06
 202																						),
 203																		'Nmi'	=> array(	'm'		=> 1.85200000000000E+03,
 204																							'mi'	=> 1.15077944802354E+00,
 205																							'Nmi'	=> 1.0,
 206																							'in'	=> 7.29133858267717E+04,
 207																							'ft'	=> 6.07611548556430E+03,
 208																							'yd'	=> 2.02537182785694E+03,
 209																							'ang'	=> 1.85200000000000E+13,
 210																							'Pica'	=> 5.24976377952723E+06
 211																						),
 212																		'in'	=> array(	'm'		=> 2.54000000000000E-02,
 213																							'mi'	=> 1.57828282828283E-05,
 214																							'Nmi'	=> 1.37149028077754E-05,
 215																							'in'	=> 1.0,
 216																							'ft'	=> 8.33333333333333E-02,
 217																							'yd'	=> 2.77777777686643E-02,
 218																							'ang'	=> 2.54000000000000E+08,
 219																							'Pica'	=> 7.19999999999955E+01
 220																						),
 221																		'ft'	=> array(	'm'		=> 3.04800000000000E-01,
 222																							'mi'	=> 1.89393939393939E-04,
 223																							'Nmi'	=> 1.64578833693305E-04,
 224																							'in'	=> 1.20000000000000E+01,
 225																							'ft'	=> 1.0,
 226																							'yd'	=> 3.33333333223972E-01,
 227																							'ang'	=> 3.04800000000000E+09,
 228																							'Pica'	=> 8.63999999999946E+02
 229																						),
 230																		'yd'	=> array(	'm'		=> 9.14400000300000E-01,
 231																							'mi'	=> 5.68181818368230E-04,
 232																							'Nmi'	=> 4.93736501241901E-04,
 233																							'in'	=> 3.60000000118110E+01,
 234																							'ft'	=> 3.00000000000000E+00,
 235																							'yd'	=> 1.0,
 236																							'ang'	=> 9.14400000300000E+09,
 237																							'Pica'	=> 2.59200000085023E+03
 238																						),
 239																		'ang'	=> array(	'm'		=> 1.00000000000000E-10,
 240																							'mi'	=> 6.21371192237334E-14,
 241																							'Nmi'	=> 5.39956803455724E-14,
 242																							'in'	=> 3.93700787401575E-09,
 243																							'ft'	=> 3.28083989501312E-10,
 244																							'yd'	=> 1.09361329797891E-10,
 245																							'ang'	=> 1.0,
 246																							'Pica'	=> 2.83464566929116E-07
 247																						),
 248																		'Pica'	=> array(	'm'		=> 3.52777777777800E-04,
 249																							'mi'	=> 2.19205948372629E-07,
 250																							'Nmi'	=> 1.90484761219114E-07,
 251																							'in'	=> 1.38888888888898E-02,
 252																							'ft'	=> 1.15740740740748E-03,
 253																							'yd'	=> 3.85802469009251E-04,
 254																							'ang'	=> 3.52777777777800E+06,
 255																							'Pica'	=> 1.0
 256																						)
 257																	),
 258												'Time'		=> array(	'yr'	=> array(	'yr'		=> 1.0,
 259																							'day'		=> 365.25,
 260																							'hr'		=> 8766.0,
 261																							'mn'		=> 525960.0,
 262																							'sec'		=> 31557600.0
 263																						),
 264																		'day'	=> array(	'yr'		=> 2.73785078713210E-03,
 265																							'day'		=> 1.0,
 266																							'hr'		=> 24.0,
 267																							'mn'		=> 1440.0,
 268																							'sec'		=> 86400.0
 269																						),
 270																		'hr'	=> array(	'yr'		=> 1.14077116130504E-04,
 271																							'day'		=> 4.16666666666667E-02,
 272																							'hr'		=> 1.0,
 273																							'mn'		=> 60.0,
 274																							'sec'		=> 3600.0
 275																						),
 276																		'mn'	=> array(	'yr'		=> 1.90128526884174E-06,
 277																							'day'		=> 6.94444444444444E-04,
 278																							'hr'		=> 1.66666666666667E-02,
 279																							'mn'		=> 1.0,
 280																							'sec'		=> 60.0
 281																						),
 282																		'sec'	=> array(	'yr'		=> 3.16880878140289E-08,
 283																							'day'		=> 1.15740740740741E-05,
 284																							'hr'		=> 2.77777777777778E-04,
 285																							'mn'		=> 1.66666666666667E-02,
 286																							'sec'		=> 1.0
 287																						)
 288																	),
 289												'Pressure'	=> array(	'Pa'	=> array(	'Pa'		=> 1.0,
 290																							'p'			=> 1.0,
 291																							'atm'		=> 9.86923299998193E-06,
 292																							'at'		=> 9.86923299998193E-06,
 293																							'mmHg'		=> 7.50061707998627E-03
 294																						),
 295																		'p'		=> array(	'Pa'		=> 1.0,
 296																							'p'			=> 1.0,
 297																							'atm'		=> 9.86923299998193E-06,
 298																							'at'		=> 9.86923299998193E-06,
 299																							'mmHg'		=> 7.50061707998627E-03
 300																						),
 301																		'atm'	=> array(	'Pa'		=> 1.01324996583000E+05,
 302																							'p'			=> 1.01324996583000E+05,
 303																							'atm'		=> 1.0,
 304																							'at'		=> 1.0,
 305																							'mmHg'		=> 760.0
 306																						),
 307																		'at'	=> array(	'Pa'		=> 1.01324996583000E+05,
 308																							'p'			=> 1.01324996583000E+05,
 309																							'atm'		=> 1.0,
 310																							'at'		=> 1.0,
 311																							'mmHg'		=> 760.0
 312																						),
 313																		'mmHg'	=> array(	'Pa'		=> 1.33322363925000E+02,
 314																							'p'			=> 1.33322363925000E+02,
 315																							'atm'		=> 1.31578947368421E-03,
 316																							'at'		=> 1.31578947368421E-03,
 317																							'mmHg'		=> 1.0
 318																						)
 319																	),
 320												'Force'		=> array(	'N'		=> array(	'N'			=> 1.0,
 321																							'dyn'		=> 1.0E+5,
 322																							'dy'		=> 1.0E+5,
 323																							'lbf'		=> 2.24808923655339E-01
 324																						),
 325																		'dyn'	=> array(	'N'			=> 1.0E-5,
 326																							'dyn'		=> 1.0,
 327																							'dy'		=> 1.0,
 328																							'lbf'		=> 2.24808923655339E-06
 329																						),
 330																		'dy'	=> array(	'N'			=> 1.0E-5,
 331																							'dyn'		=> 1.0,
 332																							'dy'		=> 1.0,
 333																							'lbf'		=> 2.24808923655339E-06
 334																						),
 335																		'lbf'	=> array(	'N'			=> 4.448222,
 336																							'dyn'		=> 4.448222E+5,
 337																							'dy'		=> 4.448222E+5,
 338																							'lbf'		=> 1.0
 339																						)
 340																	),
 341												'Energy'	=> array(	'J'		=> array(	'J'			=> 1.0,
 342																							'e'			=> 9.99999519343231E+06,
 343																							'c'			=> 2.39006249473467E-01,
 344																							'cal'		=> 2.38846190642017E-01,
 345																							'eV'		=> 6.24145700000000E+18,
 346																							'ev'		=> 6.24145700000000E+18,
 347																							'HPh'		=> 3.72506430801000E-07,
 348																							'hh'		=> 3.72506430801000E-07,
 349																							'Wh'		=> 2.77777916238711E-04,
 350																							'wh'		=> 2.77777916238711E-04,
 351																							'flb'		=> 2.37304222192651E+01,
 352																							'BTU'		=> 9.47815067349015E-04,
 353																							'btu'		=> 9.47815067349015E-04
 354																						),
 355																		'e'		=> array(	'J'			=> 1.00000048065700E-07,
 356																							'e'			=> 1.0,
 357																							'c'			=> 2.39006364353494E-08,
 358																							'cal'		=> 2.38846305445111E-08,
 359																							'eV'		=> 6.24146000000000E+11,
 360																							'ev'		=> 6.24146000000000E+11,
 361																							'HPh'		=> 3.72506609848824E-14,
 362																							'hh'		=> 3.72506609848824E-14,
 363																							'Wh'		=> 2.77778049754611E-11,
 364																							'wh'		=> 2.77778049754611E-11,
 365																							'flb'		=> 2.37304336254586E-06,
 366																							'BTU'		=> 9.47815522922962E-11,
 367																							'btu'		=> 9.47815522922962E-11
 368																						),
 369																		'c'		=> array(	'J'			=> 4.18399101363672E+00,
 370																							'e'			=> 4.18398900257312E+07,
 371																							'c'			=> 1.0,
 372																							'cal'		=> 9.99330315287563E-01,
 373																							'eV'		=> 2.61142000000000E+19,
 374																							'ev'		=> 2.61142000000000E+19,
 375																							'HPh'		=> 1.55856355899327E-06,
 376																							'hh'		=> 1.55856355899327E-06,
 377																							'Wh'		=> 1.16222030532950E-03,
 378																							'wh'		=> 1.16222030532950E-03,
 379																							'flb'		=> 9.92878733152102E+01,
 380																							'BTU'		=> 3.96564972437776E-03,
 381																							'btu'		=> 3.96564972437776E-03
 382																						),
 383																		'cal'	=> array(	'J'			=> 4.18679484613929E+00,
 384																							'e'			=> 4.18679283372801E+07,
 385																							'c'			=> 1.00067013349059E+00,
 386																							'cal'		=> 1.0,
 387																							'eV'		=> 2.61317000000000E+19,
 388																							'ev'		=> 2.61317000000000E+19,
 389																							'HPh'		=> 1.55960800463137E-06,
 390																							'hh'		=> 1.55960800463137E-06,
 391																							'Wh'		=> 1.16299914807955E-03,
 392																							'wh'		=> 1.16299914807955E-03,
 393																							'flb'		=> 9.93544094443283E+01,
 394																							'BTU'		=> 3.96830723907002E-03,
 395																							'btu'		=> 3.96830723907002E-03
 396																						),
 397																		'eV'	=> array(	'J'			=> 1.60219000146921E-19,
 398																							'e'			=> 1.60218923136574E-12,
 399																							'c'			=> 3.82933423195043E-20,
 400																							'cal'		=> 3.82676978535648E-20,
 401																							'eV'		=> 1.0,
 402																							'ev'		=> 1.0,
 403																							'HPh'		=> 5.96826078912344E-26,
 404																							'hh'		=> 5.96826078912344E-26,
 405																							'Wh'		=> 4.45053000026614E-23,
 406																							'wh'		=> 4.45053000026614E-23,
 407																							'flb'		=> 3.80206452103492E-18,
 408																							'BTU'		=> 1.51857982414846E-22,
 409																							'btu'		=> 1.51857982414846E-22
 410																						),
 411																		'ev'	=> array(	'J'			=> 1.60219000146921E-19,
 412																							'e'			=> 1.60218923136574E-12,
 413																							'c'			=> 3.82933423195043E-20,
 414																							'cal'		=> 3.82676978535648E-20,
 415																							'eV'		=> 1.0,
 416																							'ev'		=> 1.0,
 417																							'HPh'		=> 5.96826078912344E-26,
 418																							'hh'		=> 5.96826078912344E-26,
 419																							'Wh'		=> 4.45053000026614E-23,
 420																							'wh'		=> 4.45053000026614E-23,
 421																							'flb'		=> 3.80206452103492E-18,
 422																							'BTU'		=> 1.51857982414846E-22,
 423																							'btu'		=> 1.51857982414846E-22
 424																						),
 425																		'HPh'	=> array(	'J'			=> 2.68451741316170E+06,
 426																							'e'			=> 2.68451612283024E+13,
 427																							'c'			=> 6.41616438565991E+05,
 428																							'cal'		=> 6.41186757845835E+05,
 429																							'eV'		=> 1.67553000000000E+25,
 430																							'ev'		=> 1.67553000000000E+25,
 431																							'HPh'		=> 1.0,
 432																							'hh'		=> 1.0,
 433																							'Wh'		=> 7.45699653134593E+02,
 434																							'wh'		=> 7.45699653134593E+02,
 435																							'flb'		=> 6.37047316692964E+07,
 436																							'BTU'		=> 2.54442605275546E+03,
 437																							'btu'		=> 2.54442605275546E+03
 438																						),
 439																		'hh'	=> array(	'J'			=> 2.68451741316170E+06,
 440																							'e'			=> 2.68451612283024E+13,
 441																							'c'			=> 6.41616438565991E+05,
 442																							'cal'		=> 6.41186757845835E+05,
 443																							'eV'		=> 1.67553000000000E+25,
 444																							'ev'		=> 1.67553000000000E+25,
 445																							'HPh'		=> 1.0,
 446																							'hh'		=> 1.0,
 447																							'Wh'		=> 7.45699653134593E+02,
 448																							'wh'		=> 7.45699653134593E+02,
 449																							'flb'		=> 6.37047316692964E+07,
 450																							'BTU'		=> 2.54442605275546E+03,
 451																							'btu'		=> 2.54442605275546E+03
 452																						),
 453																		'Wh'	=> array(	'J'			=> 3.59999820554720E+03,
 454																							'e'			=> 3.59999647518369E+10,
 455																							'c'			=> 8.60422069219046E+02,
 456																							'cal'		=> 8.59845857713046E+02,
 457																							'eV'		=> 2.24692340000000E+22,
 458																							'ev'		=> 2.24692340000000E+22,
 459																							'HPh'		=> 1.34102248243839E-03,
 460																							'hh'		=> 1.34102248243839E-03,
 461																							'Wh'		=> 1.0,
 462																							'wh'		=> 1.0,
 463																							'flb'		=> 8.54294774062316E+04,
 464																							'BTU'		=> 3.41213254164705E+00,
 465																							'btu'		=> 3.41213254164705E+00
 466																						),
 467																		'wh'	=> array(	'J'			=> 3.59999820554720E+03,
 468																							'e'			=> 3.59999647518369E+10,
 469																							'c'			=> 8.60422069219046E+02,
 470																							'cal'		=> 8.59845857713046E+02,
 471																							'eV'		=> 2.24692340000000E+22,
 472																							'ev'		=> 2.24692340000000E+22,
 473																							'HPh'		=> 1.34102248243839E-03,
 474																							'hh'		=> 1.34102248243839E-03,
 475																							'Wh'		=> 1.0,
 476																							'wh'		=> 1.0,
 477																							'flb'		=> 8.54294774062316E+04,
 478																							'BTU'		=> 3.41213254164705E+00,
 479																							'btu'		=> 3.41213254164705E+00
 480																						),
 481																		'flb'	=> array(	'J'			=> 4.21400003236424E-02,
 482																							'e'			=> 4.21399800687660E+05,
 483																							'c'			=> 1.00717234301644E-02,
 484																							'cal'		=> 1.00649785509554E-02,
 485																							'eV'		=> 2.63015000000000E+17,
 486																							'ev'		=> 2.63015000000000E+17,
 487																							'HPh'		=> 1.56974211145130E-08,
 488																							'hh'		=> 1.56974211145130E-08,
 489																							'Wh'		=> 1.17055614802000E-05,
 490																							'wh'		=> 1.17055614802000E-05,
 491																							'flb'		=> 1.0,
 492																							'BTU'		=> 3.99409272448406E-05,
 493																							'btu'		=> 3.99409272448406E-05
 494																						),
 495																		'BTU'	=> array(	'J'			=> 1.05505813786749E+03,
 496																							'e'			=> 1.05505763074665E+10,
 497																							'c'			=> 2.52165488508168E+02,
 498																							'cal'		=> 2.51996617135510E+02,
 499																							'eV'		=> 6.58510000000000E+21,
 500																							'ev'		=> 6.58510000000000E+21,
 501																							'HPh'		=> 3.93015941224568E-04,
 502																							'hh'		=> 3.93015941224568E-04,
 503																							'Wh'		=> 2.93071851047526E-01,
 504																							'wh'		=> 2.93071851047526E-01,
 505																							'flb'		=> 2.50369750774671E+04,
 506																							'BTU'		=> 1.0,
 507																							'btu'		=> 1.0,
 508																						),
 509																		'btu'	=> array(	'J'			=> 1.05505813786749E+03,
 510																							'e'			=> 1.05505763074665E+10,
 511																							'c'			=> 2.52165488508168E+02,
 512																							'cal'		=> 2.51996617135510E+02,
 513																							'eV'		=> 6.58510000000000E+21,
 514																							'ev'		=> 6.58510000000000E+21,
 515																							'HPh'		=> 3.93015941224568E-04,
 516																							'hh'		=> 3.93015941224568E-04,
 517																							'Wh'		=> 2.93071851047526E-01,
 518																							'wh'		=> 2.93071851047526E-01,
 519																							'flb'		=> 2.50369750774671E+04,
 520																							'BTU'		=> 1.0,
 521																							'btu'		=> 1.0,
 522																						)
 523																	),
 524												'Power'		=> array(	'HP'	=> array(	'HP'		=> 1.0,
 525																							'h'			=> 1.0,
 526																							'W'			=> 7.45701000000000E+02,
 527																							'w'			=> 7.45701000000000E+02
 528																						),
 529																		'h'		=> array(	'HP'		=> 1.0,
 530																							'h'			=> 1.0,
 531																							'W'			=> 7.45701000000000E+02,
 532																							'w'			=> 7.45701000000000E+02
 533																						),
 534																		'W'		=> array(	'HP'		=> 1.34102006031908E-03,
 535																							'h'			=> 1.34102006031908E-03,
 536																							'W'			=> 1.0,
 537																							'w'			=> 1.0
 538																						),
 539																		'w'		=> array(	'HP'		=> 1.34102006031908E-03,
 540																							'h'			=> 1.34102006031908E-03,
 541																							'W'			=> 1.0,
 542																							'w'			=> 1.0
 543																						)
 544																	),
 545												'Magnetism'	=> array(	'T'		=> array(	'T'			=> 1.0,
 546																							'ga'		=> 10000.0
 547																						),
 548																		'ga'	=> array(	'T'			=> 0.0001,
 549																							'ga'		=> 1.0
 550																						)
 551																	),
 552												'Liquid'	=> array(	'tsp'	=> array(	'tsp'		=> 1.0,
 553																							'tbs'		=> 3.33333333333333E-01,
 554																							'oz'		=> 1.66666666666667E-01,
 555																							'cup'		=> 2.08333333333333E-02,
 556																							'pt'		=> 1.04166666666667E-02,
 557																							'us_pt'		=> 1.04166666666667E-02,
 558																							'uk_pt'		=> 8.67558516821960E-03,
 559																							'qt'		=> 5.20833333333333E-03,
 560																							'gal'		=> 1.30208333333333E-03,
 561																							'l'			=> 4.92999408400710E-03,
 562																							'lt'		=> 4.92999408400710E-03
 563																						),
 564																		'tbs'	=> array(	'tsp'		=> 3.00000000000000E+00,
 565																							'tbs'		=> 1.0,
 566																							'oz'		=> 5.00000000000000E-01,
 567																							'cup'		=> 6.25000000000000E-02,
 568																							'pt'		=> 3.12500000000000E-02,
 569																							'us_pt'		=> 3.12500000000000E-02,
 570																							'uk_pt'		=> 2.60267555046588E-02,
 571																							'qt'		=> 1.56250000000000E-02,
 572																							'gal'		=> 3.90625000000000E-03,
 573																							'l'			=> 1.47899822520213E-02,
 574																							'lt'		=> 1.47899822520213E-02
 575																						),
 576																		'oz'	=> array(	'tsp'		=> 6.00000000000000E+00,
 577																							'tbs'		=> 2.00000000000000E+00,
 578																							'oz'		=> 1.0,
 579																							'cup'		=> 1.25000000000000E-01,
 580																							'pt'		=> 6.25000000000000E-02,
 581																							'us_pt'		=> 6.25000000000000E-02,
 582																							'uk_pt'		=> 5.20535110093176E-02,
 583																							'qt'		=> 3.12500000000000E-02,
 584																							'gal'		=> 7.81250000000000E-03,
 585																							'l'			=> 2.95799645040426E-02,
 586																							'lt'		=> 2.95799645040426E-02
 587																						),
 588																		'cup'	=> array(	'tsp'		=> 4.80000000000000E+01,
 589																							'tbs'		=> 1.60000000000000E+01,
 590																							'oz'		=> 8.00000000000000E+00,
 591																							'cup'		=> 1.0,
 592																							'pt'		=> 5.00000000000000E-01,
 593																							'us_pt'		=> 5.00000000000000E-01,
 594																							'uk_pt'		=> 4.16428088074541E-01,
 595																							'qt'		=> 2.50000000000000E-01,
 596																							'gal'		=> 6.25000000000000E-02,
 597																							'l'			=> 2.36639716032341E-01,
 598																							'lt'		=> 2.36639716032341E-01
 599																						),
 600																		'pt'	=> array(	'tsp'		=> 9.60000000000000E+01,
 601																							'tbs'		=> 3.20000000000000E+01,
 602																							'oz'		=> 1.60000000000000E+01,
 603																							'cup'		=> 2.00000000000000E+00,
 604																							'pt'		=> 1.0,
 605																							'us_pt'		=> 1.0,
 606																							'uk_pt'		=> 8.32856176149081E-01,
 607																							'qt'		=> 5.00000000000000E-01,
 608																							'gal'		=> 1.25000000000000E-01,
 609																							'l'			=> 4.73279432064682E-01,
 610																							'lt'		=> 4.73279432064682E-01
 611																						),
 612																		'us_pt'	=> array(	'tsp'		=> 9.60000000000000E+01,
 613																							'tbs'		=> 3.20000000000000E+01,
 614																							'oz'		=> 1.60000000000000E+01,
 615																							'cup'		=> 2.00000000000000E+00,
 616																							'pt'		=> 1.0,
 617																							'us_pt'		=> 1.0,
 618																							'uk_pt'		=> 8.32856176149081E-01,
 619																							'qt'		=> 5.00000000000000E-01,
 620																							'gal'		=> 1.25000000000000E-01,
 621																							'l'			=> 4.73279432064682E-01,
 622																							'lt'		=> 4.73279432064682E-01
 623																						),
 624																		'uk_pt'	=> array(	'tsp'		=> 1.15266000000000E+02,
 625																							'tbs'		=> 3.84220000000000E+01,
 626																							'oz'		=> 1.92110000000000E+01,
 627																							'cup'		=> 2.40137500000000E+00,
 628																							'pt'		=> 1.20068750000000E+00,
 629																							'us_pt'		=> 1.20068750000000E+00,
 630																							'uk_pt'		=> 1.0,
 631																							'qt'		=> 6.00343750000000E-01,
 632																							'gal'		=> 1.50085937500000E-01,
 633																							'l'			=> 5.68260698087162E-01,
 634																							'lt'		=> 5.68260698087162E-01
 635																						),
 636																		'qt'	=> array(	'tsp'		=> 1.92000000000000E+02,
 637																							'tbs'		=> 6.40000000000000E+01,
 638																							'oz'		=> 3.20000000000000E+01,
 639																							'cup'		=> 4.00000000000000E+00,
 640																							'pt'		=> 2.00000000000000E+00,
 641																							'us_pt'		=> 2.00000000000000E+00,
 642																							'uk_pt'		=> 1.66571235229816E+00,
 643																							'qt'		=> 1.0,
 644																							'gal'		=> 2.50000000000000E-01,
 645																							'l'			=> 9.46558864129363E-01,
 646																							'lt'		=> 9.46558864129363E-01
 647																						),
 648																		'gal'	=> array(	'tsp'		=> 7.68000000000000E+02,
 649																							'tbs'		=> 2.56000000000000E+02,
 650																							'oz'		=> 1.28000000000000E+02,
 651																							'cup'		=> 1.60000000000000E+01,
 652																							'pt'		=> 8.00000000000000E+00,
 653																							'us_pt'		=> 8.00000000000000E+00,
 654																							'uk_pt'		=> 6.66284940919265E+00,
 655																							'qt'		=> 4.00000000000000E+00,
 656																							'gal'		=> 1.0,
 657																							'l'			=> 3.78623545651745E+00,
 658																							'lt'		=> 3.78623545651745E+00
 659																						),
 660																		'l'		=> array(	'tsp'		=> 2.02840000000000E+02,
 661																							'tbs'		=> 6.76133333333333E+01,
 662																							'oz'		=> 3.38066666666667E+01,
 663																							'cup'		=> 4.22583333333333E+00,
 664																							'pt'		=> 2.11291666666667E+00,
 665																							'us_pt'		=> 2.11291666666667E+00,
 666																							'uk_pt'		=> 1.75975569552166E+00,
 667																							'qt'		=> 1.05645833333333E+00,
 668																							'gal'		=> 2.64114583333333E-01,
 669																							'l'			=> 1.0,
 670																							'lt'		=> 1.0
 671																						),
 672																		'lt'	=> array(	'tsp'		=> 2.02840000000000E+02,
 673																							'tbs'		=> 6.76133333333333E+01,
 674																							'oz'		=> 3.38066666666667E+01,
 675																							'cup'		=> 4.22583333333333E+00,
 676																							'pt'		=> 2.11291666666667E+00,
 677																							'us_pt'		=> 2.11291666666667E+00,
 678																							'uk_pt'		=> 1.75975569552166E+00,
 679																							'qt'		=> 1.05645833333333E+00,
 680																							'gal'		=> 2.64114583333333E-01,
 681																							'l'			=> 1.0,
 682																							'lt'		=> 1.0
 683																						)
 684																	)
 685											);
 686
 687
 688	/**
 689	 * _parseComplex
 690	 *
 691	 * Parses a complex number into its real and imaginary parts, and an I or J suffix
 692	 *
 693	 * @param	string		$complexNumber	The complex number
 694	 * @return	string[]	Indexed on "real", "imaginary" and "suffix"
 695	 */
 696	public static function _parseComplex($complexNumber) {
 697		$workString = (string) $complexNumber;
 698
 699		$realNumber = $imaginary = 0;
 700		//	Extract the suffix, if there is one
 701		$suffix = substr($workString,-1);
 702		if (!is_numeric($suffix)) {
 703			$workString = substr($workString,0,-1);
 704		} else {
 705			$suffix = '';
 706		}
 707
 708		//	Split the input into its Real and Imaginary components
 709		$leadingSign = 0;
 710		if (strlen($workString) > 0) {
 711			$leadingSign = (($workString{0} == '+') || ($workString{0} == '-')) ? 1 : 0;
 712		}
 713		$power = '';
 714		$realNumber = strtok($workString, '+-');
 715		if (strtoupper(substr($realNumber,-1)) == 'E') {
 716			$power = strtok('+-');
 717			++$leadingSign;
 718		}
 719
 720		$realNumber = substr($workString,0,strlen($realNumber)+strlen($power)+$leadingSign);
 721
 722		if ($suffix != '') {
 723			$imaginary = substr($workString,strlen($realNumber));
 724
 725			if (($imaginary == '') && (($realNumber == '') || ($realNumber == '+') || ($realNumber == '-'))) {
 726				$imaginary = $realNumber.'1';
 727				$realNumber = '0';
 728			} else if ($imaginary == '') {
 729				$imaginary = $realNumber;
 730				$realNumber = '0';
 731			} elseif (($imaginary == '+') || ($imaginary == '-')) {
 732				$imaginary .= '1';
 733			}
 734		}
 735
 736		return array( 'real'		=> $realNumber,
 737					  'imaginary'	=> $imaginary,
 738					  'suffix'		=> $suffix
 739					);
 740	}	//	function _parseComplex()
 741
 742
 743	/**
 744	 * _cleanComplex
 745	 *
 746	 * Cleans the leading characters in a complex number string
 747	 *
 748	 * @param	string		$complexNumber	The complex number to clean
 749	 * @return	string		The "cleaned" complex number
 750	 */
 751	private static function _cleanComplex($complexNumber) {
 752		if ($complexNumber{0} == '+') $complexNumber = substr($complexNumber,1);
 753		if ($complexNumber{0} == '0') $complexNumber = substr($complexNumber,1);
 754		if ($complexNumber{0} == '.') $complexNumber = '0'.$complexNumber;
 755		if ($complexNumber{0} == '+') $complexNumber = substr($complexNumber,1);
 756		return $complexNumber;
 757	}
 758
 759
 760	private static function _nbrConversionFormat($xVal,$places) {
 761		if (!is_null($places)) {
 762			if (strlen($xVal) <= $places) {
 763				return substr(str_pad($xVal,$places,'0',STR_PAD_LEFT),-10);
 764			} else {
 765				return PHPExcel_Calculation_Functions::NaN();
 766			}
 767		}
 768
 769		return substr($xVal,-10);
 770	}	//	function _nbrConversionFormat()
 771
 772
 773	/**
 774	 *	BESSELI
 775	 *
 776	 *	Returns the modified Bessel function In(x), which is equivalent to the Bessel function evaluated
 777	 *		for purely imaginary arguments
 778	 *
 779	 *	Excel Function:
 780	 *		BESSELI(x,ord)
 781	 *
 782	 *	@access	public
 783	 *	@category Engineering Functions
 784	 *	@param	float		$x		The value at which to evaluate the function.
 785	 *								If x is nonnumeric, BESSELI returns the #VALUE! error value.
 786	 *	@param	integer		$ord	The order of the Bessel function.
 787	 *								If ord is not an integer, it is truncated.
 788	 *								If $ord is nonnumeric, BESSELI returns the #VALUE! error value.
 789	 *								If $ord < 0, BESSELI returns the #NUM! error value.
 790	 *	@return	float
 791	 *
 792	 */
 793	public static function BESSELI($x, $ord) {
 794		$x	= (is_null($x))	? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($x);
 795		$ord	= (is_null($ord))	? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($ord);
 796
 797		if ((is_numeric($x)) && (is_numeric($ord))) {
 798			$ord	= floor($ord);
 799			if ($ord < 0) {
 800				return PHPExcel_Calculation_Functions::NaN();
 801			}
 802
 803			if (abs($x) <= 30) {
 804				$fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord);
 805				$ordK = 1;
 806				$fSqrX = ($x * $x) / 4;
 807				do {
 808					$fTerm *= $fSqrX;
 809					$fTerm /= ($ordK * ($ordK + $ord));
 810					$fResult += $fTerm;
 811				} while ((abs($fTerm) > 1e-12) && (++$ordK < 100));
 812			} else {
 813				$f_2_PI = 2 * M_PI;
 814
 815				$fXAbs = abs($x);
 816				$fResult = exp($fXAbs) / sqrt($f_2_PI * $fXAbs);
 817				if (($ord & 1) && ($x < 0)) {
 818					$fResult = -$fResult;
 819				}
 820			}
 821			return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult;
 822		}
 823		return PHPExcel_Calculation_Functions::VALUE();
 824	}	//	function BESSELI()
 825
 826
 827	/**
 828	 *	BESSELJ
 829	 *
 830	 *	Returns the Bessel function
 831	 *
 832	 *	Excel Function:
 833	 *		BESSELJ(x,ord)
 834	 *
 835	 *	@access	public
 836	 *	@category Engineering Functions
 837	 *	@param	float		$x		The value at which to evaluate the function.
 838	 *								If x is nonnumeric, BESSELJ returns the #VALUE! error value.
 839	 *	@param	integer		$ord	The order of the Bessel function. If n is not an integer, it is truncated.
 840	 *								If $ord is nonnumeric, BESSELJ returns the #VALUE! error value.
 841	 *								If $ord < 0, BESSELJ returns the #NUM! error value.
 842	 *	@return	float
 843	 *
 844	 */
 845	public static function BESSELJ($x, $ord) {
 846		$x	= (is_null($x))	? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($x);
 847		$ord	= (is_null($ord))	? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($ord);
 848
 849		if ((is_numeric($x)) && (is_numeric($ord))) {
 850			$ord	= floor($ord);
 851			if ($ord < 0) {
 852				return PHPExcel_Calculation_Functions::NaN();
 853			}
 854
 855			$fResult = 0;
 856			if (abs($x) <= 30) {
 857				$fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord);
 858				$ordK = 1;
 859				$fSqrX = ($x * $x) / -4;
 860				do {
 861					$fTerm *= $fSqrX;
 862					$fTerm /= ($ordK * ($ordK + $ord));
 863					$fResult += $fTerm;
 864				} while ((abs($fTerm) > 1e-12) && (++$ordK < 100));
 865			} else {
 866				$f_PI_DIV_2 = M_PI / 2;
 867				$f_PI_DIV_4 = M_PI / 4;
 868
 869				$fXAbs = abs($x);
 870				$fResult = sqrt(M_2DIVPI / $fXAbs) * cos($fXAbs - $ord * $f_PI_DIV_2 - $f_PI_DIV_4);
 871				if (($ord & 1) && ($x < 0)) {
 872					$fResult = -$fResult;
 873				}
 874			}
 875			return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult;
 876		}
 877		return PHPExcel_Calculation_Functions::VALUE();
 878	}	//	function BESSELJ()
 879
 880
 881	private static function _Besselk0($fNum) {
 882		if ($fNum <= 2) {
 883			$fNum2 = $fNum * 0.5;
 884			$y = ($fNum2 * $fNum2);
 885			$fRet = -log($fNum2) * self::BESSELI($fNum, 0) +
 886					(-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y *
 887					(0.10750e-3 + $y * 0.74e-5))))));
 888		} else {
 889			$y = 2 / $fNum;
 890			$fRet = exp(-$fNum) / sqrt($fNum) *
 891					(1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y *
 892					(0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3))))));
 893		}
 894		return $fRet;
 895	}	//	function _Besselk0()
 896
 897
 898	private static function _Besselk1($fNum) {
 899		if ($fNum <= 2) {
 900			$fNum2 = $fNum * 0.5;
 901			$y = ($fNum2 * $fNum2);
 902			$fRet = log($fNum2) * self::BESSELI($fNum, 1) +
 903					(1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y *
 904					(-0.110404e-2 + $y * (-0.4686e-4))))))) / $fNum;
 905		} else {
 906			$y = 2 / $fNum;
 907			$fRet = exp(-$fNum) / sqrt($fNum) *
 908					(1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y *
 909					(0.325614e-2 + $y * (-0.68245e-3)))))));
 910		}
 911		return $fRet;
 912	}	//	function _Besselk1()
 913
 914
 915	/**
 916	 *	BESSELK
 917	 *
 918	 *	Returns the modified Bessel function Kn(x), which is equivalent to the Bessel functions evaluated
 919	 *		for purely imaginary arguments.
 920	 *
 921	 *	Excel Function:
 922	 *		BESSELK(x,ord)
 923	 *
 924	 *	@access	public
 925	 *	@category Engineering Functions
 926	 *	@param	float		$x		The value at which to evaluate the function.
 927	 *								If x is nonnumeric, BESSELK returns the #VALUE! error value.
 928	 *	@param	integer		$ord	The order of the Bessel function. If n is not an integer, it is truncated.
 929	 *								If $ord is nonnumeric, BESSELK returns the #VALUE! error value.
 930	 *								If $ord < 0, BESSELK returns the #NUM! error value.
 931	 *	@return	float
 932	 *
 933	 */
 934	public static function BESSELK($x, $ord) {
 935		$x		= (is_null($x))		? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($x);
 936		$ord	= (is_null($ord))	? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($ord);
 937
 938		if ((is_numeric($x)) && (is_numeric($ord))) {
 939			if (($ord < 0) || ($x == 0.0)) {
 940				return PHPExcel_Calculation_Functions::NaN();
 941			}
 942
 943			switch(floor($ord)) {
 944				case 0 :	return self::_Besselk0($x);
 945							break;
 946				case 1 :	return self::_Besselk1($x);
 947							break;
 948				default :	$fTox	= 2 / $x;
 949							$fBkm	= self::_Besselk0($x);
 950							$fBk	= self::_Besselk1($x);
 951							for ($n = 1; $n < $ord; ++$n) {
 952								$fBkp	= $fBkm + $n * $fTox * $fBk;
 953								$fBkm	= $fBk;
 954								$fBk	= $fBkp;
 955							}
 956			}
 957			return (is_nan($fBk)) ? PHPExcel_Calculation_Functions::NaN() : $fBk;
 958		}
 959		return PHPExcel_Calculation_Functions::VALUE();
 960	}	//	function BESSELK()
 961
 962
 963	private static function _Bessely0($fNum) {
 964		if ($fNum < 8.0) {
 965			$y = ($fNum * $fNum);
 966			$f1 = -2957821389.0 + $y * (7062834065.0 + $y * (-512359803.6 + $y * (10879881.29 + $y * (-86327.92757 + $y * 228.4622733))));
 967			$f2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y))));
 968			$fRet = $f1 / $f2 + 0.636619772 * self::BESSELJ($fNum, 0) * log($fNum);
 969		} else {
 970			$z = 8.0 / $fNum;
 971			$y = ($z * $z);
 972			$xx = $fNum - 0.785398164;
 973			$f1 = 1 + $y * (-0.1098628627e-2 + $y * (0.2734510407e-4 + $y * (-0.2073370639e-5 + $y * 0.2093887211e-6)));
 974			$f2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7))));
 975			$fRet = sqrt(0.636619772 / $fNum) * (sin($xx) * $f1 + $z * cos($xx) * $f2);
 976		}
 977		return $fRet;
 978	}	//	function _Bessely0()
 979
 980
 981	private static function _Bessely1($fNum) {
 982		if ($fNum < 8.0) {
 983			$y = ($fNum * $fNum);
 984			$f1 = $fNum * (-0.4900604943e13 + $y * (0.1275274390e13 + $y * (-0.5153438139e11 + $y * (0.7349264551e9 + $y *
 985				(-0.4237922726e7 + $y * 0.8511937935e4)))));
 986			$f2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y *
 987				(0.1020426050e6 + $y * (0.3549632885e3 + $y)))));
 988			$fRet = $f1 / $f2 + 0.636619772 * ( self::BESSELJ($fNum, 1) * log($fNum) - 1 / $fNum);
 989		} else {
 990			$fRet = sqrt(0.636619772 / $fNum) * sin($fNum - 2.356194491);
 991		}
 992		return $fRet;
 993	}	//	function _Bessely1()
 994
 995
 996	/**
 997	 *	BESSELY
 998	 *
 999	 *	Returns the Bessel function, which is also called the Weber function or the Neumann function.
1000	 *
1001	 *	Excel Function:
1002	 *		BESSELY(x,ord)
1003	 *
1004	 *	@access	public
1005	 *	@category Engineering Functions
1006	 *	@param	float		$x		The value at which to evaluate the function.
1007	 *								If x is nonnumeric, BESSELK returns the #VALUE! error value.
1008	 *	@param	integer		$ord	The order of the Bessel function. If n is not an integer, it is truncated.
1009	 *								If $ord is nonnumeric, BESSELK returns the #VALUE! error value.
1010	 *								If $ord < 0, BESSELK returns the #NUM! error value.
1011	 *
1012	 *	@return	float
1013	 */
1014	public static function BESSELY($x, $ord) {
1015		$x		= (is_null($x))		? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($x);
1016		$ord	= (is_null($ord))	? 0.0 :	PHPExcel_Calculation_Functions::flattenSingleValue($ord);
1017
1018		if ((is_numeric($x)) && (is_numeric($ord))) {
1019			if (($ord < 0) || ($x == 0.0)) {
1020				return PHPExcel_Calculation_Functions::NaN();
1021			}
1022
1023			switch(floor($ord)) {
1024				case 0 :	return self::_Bessely0($x);
1025							break;
1026				case 1 :	return self::_Bessely1($x);
1027							break;
1028				default:	$fTox	= 2 / $x;
1029							$fBym	= self::_Bessely0($x);
1030							$fBy	= self::_Bessely1($x);
1031							for ($n = 1; $n < $ord; ++$n) {
1032								$fByp	= $n * $fTox * $fBy - $fBym;
1033								$fBym	= $fBy;
1034								$fBy	= $fByp;
1035							}
1036			}
1037			return (is_nan($fBy)) ? PHPExcel_Calculation_Functions::NaN() : $fBy;
1038		}
1039		return PHPExcel_Calculation_Functions::VALUE();
1040	}	//	function BESSELY()
1041
1042
1043	/**
1044	 * BINTODEC
1045	 *
1046	 * Return a binary value as decimal.
1047	 *
1048	 * Excel Function:
1049	 *		BIN2DEC(x)
1050	 *
1051	 * @access	public
1052	 * @category Engineering Functions
1053	 * @param	string		$x		The binary number (as a string) that you want to convert. The number
1054	 *								cannot contain more than 10 characters (10 bits). The most significant
1055	 *								bit of number is the sign bit. The remaining 9 bits are magnitude bits.
1056	 *								Negative numbers are represented using two's-complement notation.
1057	 *								If number is not a valid binary number, or if number contains more than
1058	 *								10 characters (10 bits), BIN2DEC returns the #NUM! error value.
1059	 * @return	string
1060	 */
1061	public static function BINTODEC($x) {
1062		$x	= PHPExcel_Calculation_Functions::flattenSingleValue($x);
1063
1064		if (is_bool($x)) {
1065			if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
1066				$x = (int) $x;
1067			} else {
1068				return PHPExcel_Calculation_Functions::VALUE();
1069			}
1070		}
1071		if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {
1072			$x = floor($x);
1073		}
1074		$x = (string) $x;
1075		if (strlen($x) > preg_match_all('/[01]/',$x,$out)) {
1076			return PHPExcel_Calculation_Functions::NaN();
1077		}
1078		if (strlen($x) > 10) {
1079			return PHPExcel_Calculation_Functions::NaN();
1080		} elseif (strlen($x) == 10) {
1081			//	Two's Complement
1082			$x = substr($x,-9);
1083			return '-'.(512-bindec($x));
1084		}
1085		return bindec($x);
1086	}	//	function BINTODEC()
1087
1088
1089	/**
1090	 * BINTOHEX
1091	 *
1092	 * Return a binary value as hex.
1093	 *
1094	 * Excel Function:
1095	 *		BIN2HEX(x[,places])
1096	 *
1097	 * @access	public
1098	 * @category Engineering Functions
1099	 * @param	string		$x		The binary number (as a string) that you want to convert. The number
1100	 *								cannot contain more than 10 characters (10 bits). The most significant
1101	 *								bit of number is the sign bit. The remaining 9 bits are magnitude bits.
1102	 *								Negative numbers are represented using two's-complement notation.
1103	 *								If number is not a valid binary number, or if number contains more than
1104	 *								10 characters (10 bits), BIN2HEX returns the #NUM! error value.
1105	 * @param	integer		$places	The number of characters to u…

Large files files are truncated, but you can click here to view the full file