Overview

Packages

  • JAMA
  • None
  • PHP
  • PHPExcel
    • CachedObjectStorage
    • Calculation
    • Cell
    • Chart
      • Renderer
    • Reader
      • Excel2007
      • Excel5
    • RichText
    • Settings
    • Shared
      • Escher
      • OLE
      • Trend
      • ZipArchive
    • Style
    • Worksheet
      • Drawing
    • Writer
      • 2007
      • CSV
      • Excel2007
      • Excel5
      • HTML
      • PDF

Classes

  • CholeskyDecomposition
  • Dao
  • DateTime
  • DateTimeZone
  • DOMNode
  • EigenvalueDecomposition
  • Elemento
  • Historial
  • Irradiacion
  • Latitud
  • MotorPhp
  • Panel
  • PclZip
  • Periodo
  • PHPExcel
  • PHPExcel_Autoloader
  • PHPExcel_Best_Fit
  • PHPExcel_CachedObjectStorage_APC
  • PHPExcel_CachedObjectStorage_CacheBase
  • PHPExcel_CachedObjectStorage_DiscISAM
  • PHPExcel_CachedObjectStorage_Igbinary
  • PHPExcel_CachedObjectStorage_Memcache
  • PHPExcel_CachedObjectStorage_Memory
  • PHPExcel_CachedObjectStorage_MemoryGZip
  • PHPExcel_CachedObjectStorage_MemorySerialized
  • PHPExcel_CachedObjectStorage_PHPTemp
  • PHPExcel_CachedObjectStorage_SQLite
  • PHPExcel_CachedObjectStorage_SQLite3
  • PHPExcel_CachedObjectStorage_Wincache
  • PHPExcel_CachedObjectStorageFactory
  • PHPExcel_CalcEngine_CyclicReferenceStack
  • PHPExcel_CalcEngine_Logger
  • PHPExcel_Calculation
  • PHPExcel_Calculation_Database
  • PHPExcel_Calculation_DateTime
  • PHPExcel_Calculation_Engineering
  • PHPExcel_Calculation_ExceptionHandler
  • PHPExcel_Calculation_Financial
  • PHPExcel_Calculation_FormulaParser
  • PHPExcel_Calculation_FormulaToken
  • PHPExcel_Calculation_Function
  • PHPExcel_Calculation_Functions
  • PHPExcel_Calculation_Logical
  • PHPExcel_Calculation_LookupRef
  • PHPExcel_Calculation_MathTrig
  • PHPExcel_Calculation_Statistical
  • PHPExcel_Calculation_TextData
  • PHPExcel_Calculation_Token_Stack
  • PHPExcel_Cell
  • PHPExcel_Cell_AdvancedValueBinder
  • PHPExcel_Cell_DataType
  • PHPExcel_Cell_DataValidation
  • PHPExcel_Cell_DefaultValueBinder
  • PHPExcel_Cell_Hyperlink
  • PHPExcel_Chart
  • PHPExcel_Chart_DataSeries
  • PHPExcel_Chart_DataSeriesValues
  • PHPExcel_Chart_Layout
  • PHPExcel_Chart_Legend
  • PHPExcel_Chart_PlotArea
  • PHPExcel_Chart_Renderer_jpgraph
  • PHPExcel_Chart_Title
  • PHPExcel_Comment
  • PHPExcel_DocumentProperties
  • PHPExcel_DocumentSecurity
  • PHPExcel_Exponential_Best_Fit
  • PHPExcel_HashTable
  • PHPExcel_IOFactory
  • PHPExcel_Linear_Best_Fit
  • PHPExcel_Logarithmic_Best_Fit
  • PHPExcel_NamedRange
  • PHPExcel_Polynomial_Best_Fit
  • PHPExcel_Power_Best_Fit
  • PHPExcel_Reader_Abstract
  • PHPExcel_Reader_CSV
  • PHPExcel_Reader_DefaultReadFilter
  • PHPExcel_Reader_Excel2003XML
  • PHPExcel_Reader_Excel2007
  • PHPExcel_Reader_Excel2007_Chart
  • PHPExcel_Reader_Excel2007_Theme
  • PHPExcel_Reader_Excel5
  • PHPExcel_Reader_Excel5_Escher
  • PHPExcel_Reader_Excel5_MD5
  • PHPExcel_Reader_Excel5_RC4
  • PHPExcel_Reader_Gnumeric
  • PHPExcel_Reader_HTML
  • PHPExcel_Reader_OOCalc
  • PHPExcel_Reader_SYLK
  • PHPExcel_ReferenceHelper
  • PHPExcel_RichText
  • PHPExcel_RichText_Run
  • PHPExcel_RichText_TextElement
  • PHPExcel_Settings
  • PHPExcel_Shared_CodePage
  • PHPExcel_Shared_Date
  • PHPExcel_Shared_Drawing
  • PHPExcel_Shared_Escher
  • PHPExcel_Shared_Escher_DgContainer
  • PHPExcel_Shared_Escher_DgContainer_SpgrContainer
  • PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer
  • PHPExcel_Shared_Escher_DggContainer
  • PHPExcel_Shared_Escher_DggContainer_BstoreContainer
  • PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE
  • PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip
  • PHPExcel_Shared_Excel5
  • PHPExcel_Shared_File
  • PHPExcel_Shared_Font
  • PHPExcel_Shared_JAMA_LUDecomposition
  • PHPExcel_Shared_JAMA_Matrix
  • PHPExcel_Shared_JAMA_QRDecomposition
  • PHPExcel_Shared_OLE
  • PHPExcel_Shared_OLE_ChainedBlockStream
  • PHPExcel_Shared_OLE_PPS
  • PHPExcel_Shared_OLE_PPS_File
  • PHPExcel_Shared_OLE_PPS_Root
  • PHPExcel_Shared_OLERead
  • PHPExcel_Shared_PasswordHasher
  • PHPExcel_Shared_String
  • PHPExcel_Shared_TimeZone
  • PHPExcel_Shared_XMLWriter
  • PHPExcel_Shared_ZipArchive
  • PHPExcel_Shared_ZipStreamWrapper
  • PHPExcel_Style
  • PHPExcel_Style_Alignment
  • PHPExcel_Style_Border
  • PHPExcel_Style_Borders
  • PHPExcel_Style_Color
  • PHPExcel_Style_Conditional
  • PHPExcel_Style_Fill
  • PHPExcel_Style_Font
  • PHPExcel_Style_NumberFormat
  • PHPExcel_Style_Protection
  • PHPExcel_Style_Supervisor
  • PHPExcel_Worksheet
  • PHPExcel_Worksheet_AutoFilter
  • PHPExcel_Worksheet_AutoFilter_Column
  • PHPExcel_Worksheet_AutoFilter_Column_Rule
  • PHPExcel_Worksheet_BaseDrawing
  • PHPExcel_Worksheet_CellIterator
  • PHPExcel_Worksheet_ColumnDimension
  • PHPExcel_Worksheet_Drawing
  • PHPExcel_Worksheet_Drawing_Shadow
  • PHPExcel_Worksheet_HeaderFooter
  • PHPExcel_Worksheet_HeaderFooterDrawing
  • PHPExcel_Worksheet_MemoryDrawing
  • PHPExcel_Worksheet_PageMargins
  • PHPExcel_Worksheet_PageSetup
  • PHPExcel_Worksheet_Protection
  • PHPExcel_Worksheet_Row
  • PHPExcel_Worksheet_RowDimension
  • PHPExcel_Worksheet_RowIterator
  • PHPExcel_Worksheet_SheetView
  • PHPExcel_WorksheetIterator
  • PHPExcel_Writer_Abstract
  • PHPExcel_Writer_CSV
  • PHPExcel_Writer_Excel2007
  • PHPExcel_Writer_Excel2007_Chart
  • PHPExcel_Writer_Excel2007_Comments
  • PHPExcel_Writer_Excel2007_ContentTypes
  • PHPExcel_Writer_Excel2007_DocProps
  • PHPExcel_Writer_Excel2007_Drawing
  • PHPExcel_Writer_Excel2007_Rels
  • PHPExcel_Writer_Excel2007_RelsRibbon
  • PHPExcel_Writer_Excel2007_RelsVBA
  • PHPExcel_Writer_Excel2007_StringTable
  • PHPExcel_Writer_Excel2007_Style
  • PHPExcel_Writer_Excel2007_Theme
  • PHPExcel_Writer_Excel2007_Workbook
  • PHPExcel_Writer_Excel2007_Worksheet
  • PHPExcel_Writer_Excel2007_WriterPart
  • PHPExcel_Writer_Excel5
  • PHPExcel_Writer_Excel5_BIFFwriter
  • PHPExcel_Writer_Excel5_Escher
  • PHPExcel_Writer_Excel5_Font
  • PHPExcel_Writer_Excel5_Parser
  • PHPExcel_Writer_Excel5_Workbook
  • PHPExcel_Writer_Excel5_Worksheet
  • PHPExcel_Writer_Excel5_Xf
  • PHPExcel_Writer_HTML
  • PHPExcel_Writer_PDF
  • PHPExcel_Writer_PDF_Core
  • PHPExcel_Writer_PDF_DomPDF
  • PHPExcel_Writer_PDF_mPDF
  • PHPExcel_Writer_PDF_tcPDF
  • Provincia
  • Radiacion
  • SingularValueDecomposition
  • Sistema
  • trendClass
  • xajax
  • xajaxArgumentManager
  • xajaxCallableObject
  • xajaxCallableObjectPlugin
  • xajaxControl
  • xajaxControlContainer
  • xajaxCustomRequest
  • xajaxCustomResponse
  • xajaxEvent
  • xajaxEventPlugin
  • xajaxFunctionPlugin
  • xajaxIncludeClientScriptPlugin
  • xajaxLanguageManager
  • xajaxPlugin
  • xajaxPluginManager
  • xajaxRequest
  • xajaxRequestPlugin
  • xajaxResponse
  • xajaxResponseManager
  • xajaxResponsePlugin
  • xajaxScriptPlugin
  • xajaxUserFunction
  • XMLWriter

Interfaces

  • DateTimeInterface
  • Iterator
  • PHPExcel_CachedObjectStorage_ICache
  • PHPExcel_Cell_IValueBinder
  • PHPExcel_IComparable
  • PHPExcel_Reader_IReader
  • PHPExcel_Reader_IReadFilter
  • PHPExcel_RichText_ITextElement
  • PHPExcel_Writer_IWriter
  • Throwable
  • Traversable

Exceptions

  • Exception
  • PHPExcel_Calculation_Exception
  • PHPExcel_Chart_Exception
  • PHPExcel_Exception
  • PHPExcel_Reader_Exception
  • PHPExcel_Writer_Exception

Functions

  • acosh
  • agregar_elemento
  • asinh
  • atanh
  • borrar_elementos
  • borrar_gdm_ab
  • borrar_irradiacion
  • borrar_latitud
  • borrar_panel
  • borrar_periodo
  • borrar_pmp_min_pmp_max
  • borrar_radiacion
  • borrar_resumen
  • borrar_sistema
  • borrar_sombra
  • gdm_ab
  • grabar_resumen
  • historial
  • hypo
  • irradiacion
  • JAMAError
  • latitud
  • limpiar_historial
  • login
  • mb_str_replace
  • mostrar_energia_total_ch
  • mostrar_panel_md_th
  • mostrar_panel_th
  • mostrar_radiacion_md_th
  • mostrar_radiacion_th
  • mostrar_resumen_th
  • panel
  • PclZipUtilCopyBlock
  • PclZipUtilOptionText
  • PclZipUtilPathInclusion
  • PclZipUtilPathReduction
  • PclZipUtilRename
  • PclZipUtilTranslateWinPath
  • periodo
  • pmp_min_pmp_max
  • preparar_panel
  • preparar_radiacion
  • preparar_radiacion_media
  • radiacion
  • resumen
  • sistema
  • sombra
  • xajaxCompressFile
  • xajaxErrorHandler
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  • Download
   1: <?php
   2: /**
   3:  * PHPExcel
   4:  *
   5:  * Copyright (c) 2006 - 2014 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 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
  24:  * @license     http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt   LGPL
  25:  * @version     1.8.0, 2014-03-02
  26:  */
  27: 
  28: 
  29: /** PHPExcel root directory */
  30: if (!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 */
  40: define('EULER', 2.71828182845904523536);
  41: 
  42: 
  43: /**
  44:  * PHPExcel_Calculation_Engineering
  45:  *
  46:  * @category    PHPExcel
  47:  * @package     PHPExcel_Calculation
  48:  * @copyright   Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
  49:  */
  50: class 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:      * Cleans the leading characters in a complex number string
 745:      *
 746:      * @param   string      $complexNumber  The complex number to clean
 747:      * @return  string      The "cleaned" complex number
 748:      */
 749:     private static function _cleanComplex($complexNumber) {
 750:         if ($complexNumber{0} == '+') $complexNumber = substr($complexNumber,1);
 751:         if ($complexNumber{0} == '0') $complexNumber = substr($complexNumber,1);
 752:         if ($complexNumber{0} == '.') $complexNumber = '0'.$complexNumber;
 753:         if ($complexNumber{0} == '+') $complexNumber = substr($complexNumber,1);
 754:         return $complexNumber;
 755:     }
 756: 
 757:     /**
 758:      * Formats a number base string value with leading zeroes
 759:      *
 760:      * @param   string      $xVal       The "number" to pad
 761:      * @param   integer     $places     The length that we want to pad this value
 762:      * @return  string      The padded "number"
 763:      */
 764:     private static function _nbrConversionFormat($xVal, $places) {
 765:         if (!is_null($places)) {
 766:             if (strlen($xVal) <= $places) {
 767:                 return substr(str_pad($xVal, $places, '0', STR_PAD_LEFT), -10);
 768:             } else {
 769:                 return PHPExcel_Calculation_Functions::NaN();
 770:             }
 771:         }
 772: 
 773:         return substr($xVal, -10);
 774:     }   //  function _nbrConversionFormat()
 775: 
 776:     /**
 777:      *  BESSELI
 778:      *
 779:      *  Returns the modified Bessel function In(x), which is equivalent to the Bessel function evaluated
 780:      *      for purely imaginary arguments
 781:      *
 782:      *  Excel Function:
 783:      *      BESSELI(x,ord)
 784:      *
 785:      *  @access public
 786:      *  @category Engineering Functions
 787:      *  @param  float       $x      The value at which to evaluate the function.
 788:      *                              If x is nonnumeric, BESSELI returns the #VALUE! error value.
 789:      *  @param  integer     $ord    The order of the Bessel function.
 790:      *                              If ord is not an integer, it is truncated.
 791:      *                              If $ord is nonnumeric, BESSELI returns the #VALUE! error value.
 792:      *                              If $ord < 0, BESSELI returns the #NUM! error value.
 793:      *  @return float
 794:      *
 795:      */
 796:     public static function BESSELI($x, $ord) {
 797:         $x  = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x);
 798:         $ord    = (is_null($ord))   ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord);
 799: 
 800:         if ((is_numeric($x)) && (is_numeric($ord))) {
 801:             $ord    = floor($ord);
 802:             if ($ord < 0) {
 803:                 return PHPExcel_Calculation_Functions::NaN();
 804:             }
 805: 
 806:             if (abs($x) <= 30) {
 807:                 $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord);
 808:                 $ordK = 1;
 809:                 $fSqrX = ($x * $x) / 4;
 810:                 do {
 811:                     $fTerm *= $fSqrX;
 812:                     $fTerm /= ($ordK * ($ordK + $ord));
 813:                     $fResult += $fTerm;
 814:                 } while ((abs($fTerm) > 1e-12) && (++$ordK < 100));
 815:             } else {
 816:                 $f_2_PI = 2 * M_PI;
 817: 
 818:                 $fXAbs = abs($x);
 819:                 $fResult = exp($fXAbs) / sqrt($f_2_PI * $fXAbs);
 820:                 if (($ord & 1) && ($x < 0)) {
 821:                     $fResult = -$fResult;
 822:                 }
 823:             }
 824:             return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult;
 825:         }
 826:         return PHPExcel_Calculation_Functions::VALUE();
 827:     }   //  function BESSELI()
 828: 
 829: 
 830:     /**
 831:      *  BESSELJ
 832:      *
 833:      *  Returns the Bessel function
 834:      *
 835:      *  Excel Function:
 836:      *      BESSELJ(x,ord)
 837:      *
 838:      *  @access public
 839:      *  @category Engineering Functions
 840:      *  @param  float       $x      The value at which to evaluate the function.
 841:      *                              If x is nonnumeric, BESSELJ returns the #VALUE! error value.
 842:      *  @param  integer     $ord    The order of the Bessel function. If n is not an integer, it is truncated.
 843:      *                              If $ord is nonnumeric, BESSELJ returns the #VALUE! error value.
 844:      *                              If $ord < 0, BESSELJ returns the #NUM! error value.
 845:      *  @return float
 846:      *
 847:      */
 848:     public static function BESSELJ($x, $ord) {
 849:         $x  = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x);
 850:         $ord    = (is_null($ord))   ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord);
 851: 
 852:         if ((is_numeric($x)) && (is_numeric($ord))) {
 853:             $ord    = floor($ord);
 854:             if ($ord < 0) {
 855:                 return PHPExcel_Calculation_Functions::NaN();
 856:             }
 857: 
 858:             $fResult = 0;
 859:             if (abs($x) <= 30) {
 860:                 $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord);
 861:                 $ordK = 1;
 862:                 $fSqrX = ($x * $x) / -4;
 863:                 do {
 864:                     $fTerm *= $fSqrX;
 865:                     $fTerm /= ($ordK * ($ordK + $ord));
 866:                     $fResult += $fTerm;
 867:                 } while ((abs($fTerm) > 1e-12) && (++$ordK < 100));
 868:             } else {
 869:                 $f_PI_DIV_2 = M_PI / 2;
 870:                 $f_PI_DIV_4 = M_PI / 4;
 871: 
 872:                 $fXAbs = abs($x);
 873:                 $fResult = sqrt(M_2DIVPI / $fXAbs) * cos($fXAbs - $ord * $f_PI_DIV_2 - $f_PI_DIV_4);
 874:                 if (($ord & 1) && ($x < 0)) {
 875:                     $fResult = -$fResult;
 876:                 }
 877:             }
 878:             return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult;
 879:         }
 880:         return PHPExcel_Calculation_Functions::VALUE();
 881:     }   //  function BESSELJ()
 882: 
 883: 
 884:     private static function _Besselk0($fNum) {
 885:         if ($fNum <= 2) {
 886:             $fNum2 = $fNum * 0.5;
 887:             $y = ($fNum2 * $fNum2);
 888:             $fRet = -log($fNum2) * self::BESSELI($fNum, 0) +
 889:                     (-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y *
 890:                     (0.10750e-3 + $y * 0.74e-5))))));
 891:         } else {
 892:             $y = 2 / $fNum;
 893:             $fRet = exp(-$fNum) / sqrt($fNum) *
 894:                     (1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y *
 895:                     (0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3))))));
 896:         }
 897:         return $fRet;
 898:     }   //  function _Besselk0()
 899: 
 900: 
 901:     private static function _Besselk1($fNum) {
 902:         if ($fNum <= 2) {
 903:             $fNum2 = $fNum * 0.5;
 904:             $y = ($fNum2 * $fNum2);
 905:             $fRet = log($fNum2) * self::BESSELI($fNum, 1) +
 906:                     (1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y *
 907:                     (-0.110404e-2 + $y * (-0.4686e-4))))))) / $fNum;
 908:         } else {
 909:             $y = 2 / $fNum;
 910:             $fRet = exp(-$fNum) / sqrt($fNum) *
 911:                     (1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y *
 912:                     (0.325614e-2 + $y * (-0.68245e-3)))))));
 913:         }
 914:         return $fRet;
 915:     }   //  function _Besselk1()
 916: 
 917: 
 918:     /**
 919:      *  BESSELK
 920:      *
 921:      *  Returns the modified Bessel function Kn(x), which is equivalent to the Bessel functions evaluated
 922:      *      for purely imaginary arguments.
 923:      *
 924:      *  Excel Function:
 925:      *      BESSELK(x,ord)
 926:      *
 927:      *  @access public
 928:      *  @category Engineering Functions
 929:      *  @param  float       $x      The value at which to evaluate the function.
 930:      *                              If x is nonnumeric, BESSELK returns the #VALUE! error value.
 931:      *  @param  integer     $ord    The order of the Bessel function. If n is not an integer, it is truncated.
 932:      *                              If $ord is nonnumeric, BESSELK returns the #VALUE! error value.
 933:      *                              If $ord < 0, BESSELK returns the #NUM! error value.
 934:      *  @return float
 935:      *
 936:      */
 937:     public static function BESSELK($x, $ord) {
 938:         $x      = (is_null($x))     ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x);
 939:         $ord    = (is_null($ord))   ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord);
 940: 
 941:         if ((is_numeric($x)) && (is_numeric($ord))) {
 942:             if (($ord < 0) || ($x == 0.0)) {
 943:                 return PHPExcel_Calculation_Functions::NaN();
 944:             }
 945: 
 946:             switch(floor($ord)) {
 947:                 case 0 :    return self::_Besselk0($x);
 948:                             break;
 949:                 case 1 :    return self::_Besselk1($x);
 950:                             break;
 951:                 default :   $fTox   = 2 / $x;
 952:                             $fBkm   = self::_Besselk0($x);
 953:                             $fBk    = self::_Besselk1($x);
 954:                             for ($n = 1; $n < $ord; ++$n) {
 955:                                 $fBkp   = $fBkm + $n * $fTox * $fBk;
 956:                                 $fBkm   = $fBk;
 957:                                 $fBk    = $fBkp;
 958:                             }
 959:             }
 960:             return (is_nan($fBk)) ? PHPExcel_Calculation_Functions::NaN() : $fBk;
 961:         }
 962:         return PHPExcel_Calculation_Functions::VALUE();
 963:     }   //  function BESSELK()
 964: 
 965: 
 966:     private static function _Bessely0($fNum) {
 967:         if ($fNum < 8.0) {
 968:             $y = ($fNum * $fNum);
 969:             $f1 = -2957821389.0 + $y * (7062834065.0 + $y * (-512359803.6 + $y * (10879881.29 + $y * (-86327.92757 + $y * 228.4622733))));
 970:             $f2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y))));
 971:             $fRet = $f1 / $f2 + 0.636619772 * self::BESSELJ($fNum, 0) * log($fNum);
 972:         } else {
 973:             $z = 8.0 / $fNum;
 974:             $y = ($z * $z);
 975:             $xx = $fNum - 0.785398164;
 976:             $f1 = 1 + $y * (-0.1098628627e-2 + $y * (0.2734510407e-4 + $y * (-0.2073370639e-5 + $y * 0.2093887211e-6)));
 977:             $f2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7))));
 978:             $fRet = sqrt(0.636619772 / $fNum) * (sin($xx) * $f1 + $z * cos($xx) * $f2);
 979:         }
 980:         return $fRet;
 981:     }   //  function _Bessely0()
 982: 
 983: 
 984:     private static function _Bessely1($fNum) {
 985:         if ($fNum < 8.0) {
 986:             $y = ($fNum * $fNum);
 987:             $f1 = $fNum * (-0.4900604943e13 + $y * (0.1275274390e13 + $y * (-0.5153438139e11 + $y * (0.7349264551e9 + $y *
 988:                 (-0.4237922726e7 + $y * 0.8511937935e4)))));
 989:             $f2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y *
 990:                 (0.1020426050e6 + $y * (0.3549632885e3 + $y)))));
 991:             $fRet = $f1 / $f2 + 0.636619772 * ( self::BESSELJ($fNum, 1) * log($fNum) - 1 / $fNum);
 992:         } else {
 993:             $fRet = sqrt(0.636619772 / $fNum) * sin($fNum - 2.356194491);
 994:         }
 995:         return $fRet;
 996:     }   //  function _Bessely1()
 997: 
 998: 
 999:     /**
1000:      *  BESSELY
1001:      *
1002:      *  Returns the Bessel function, which is also called the Weber function or the Neumann function.
1003:      *
1004:      *  Excel Function:
1005:      *      BESSELY(x,ord)
1006:      *
1007:      *  @access public
1008:      *  @category Engineering Functions
1009:      *  @param  float       $x      The value at which to evaluate the function.
1010:      *                              If x is nonnumeric, BESSELK returns the #VALUE! error value.
1011:      *  @param  integer     $ord    The order of the Bessel function. If n is not an integer, it is truncated.
1012:      *                              If $ord is nonnumeric, BESSELK returns the #VALUE! error value.
1013:      *                              If $ord < 0, BESSELK returns the #NUM! error value.
1014:      *
1015:      *  @return float
1016:      */
1017:     public static function BESSELY($x, $ord) {
1018:         $x      = (is_null($x))     ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x);
1019:         $ord    = (is_null($ord))   ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord);
1020: 
1021:         if ((is_numeric($x)) && (is_numeric($ord))) {
1022:             if (($ord < 0) || ($x == 0.0)) {
1023:                 return PHPExcel_Calculation_Functions::NaN();
1024:             }
1025: 
1026:             switch(floor($ord)) {
1027:                 case 0 :    return self::_Bessely0($x);
1028:                             break;
1029:                 case 1 :    return self::_Bessely1($x);
1030:                             break;
1031:                 default:    $fTox   = 2 / $x;
1032:                             $fBym   = self::_Bessely0($x);
1033:                             $fBy    = self::_Bessely1($x);
1034:                             for ($n = 1; $n < $ord; ++$n) {
1035:                                 $fByp   = $n * $fTox * $fBy - $fBym;
1036:                                 $fBym   = $fBy;
1037:                                 $fBy    = $fByp;
1038:                             }
1039:             }
1040:             return (is_nan($fBy)) ? PHPExcel_Calculation_Functions::NaN() : $fBy;
1041:         }
1042:         return PHPExcel_Calculation_Functions::VALUE();
1043:     }   //  function BESSELY()
1044: 
1045: 
1046:     /**
1047:      * BINTODEC
1048:      *
1049:      * Return a binary value as decimal.
1050:      *
1051:      * Excel Function:
1052:      *      BIN2DEC(x)
1053:      *
1054:      * @access  public
1055:      * @category Engineering Functions
1056:      * @param   string      $x      The binary number (as a string) that you want to convert. The number
1057:      *                              cannot contain more than 10 characters (10 bits). The most significant
1058:      *                              bit of number is the sign bit. The remaining 9 bits are magnitude bits.
1059:      *                              Negative numbers are represented using two's-complement notation.
1060:      *                              If number is not a valid binary number, or if number contains more than
1061:      *                              10 characters (10 bits), BIN2DEC returns the #NUM! error value.
1062:      * @return  string
1063:      */
1064:     public static function BINTODEC($x) {
1065:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1066: 
1067:         if (is_bool($x)) {
1068:             if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
1069:                 $x = (int) $x;
1070:             } else {
1071:                 return PHPExcel_Calculation_Functions::VALUE();
1072:             }
1073:         }
1074:         if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {
1075:             $x = floor($x);
1076:         }
1077:         $x = (string) $x;
1078:         if (strlen($x) > preg_match_all('/[01]/',$x,$out)) {
1079:             return PHPExcel_Calculation_Functions::NaN();
1080:         }
1081:         if (strlen($x) > 10) {
1082:             return PHPExcel_Calculation_Functions::NaN();
1083:         } elseif (strlen($x) == 10) {
1084:             //  Two's Complement
1085:             $x = substr($x,-9);
1086:             return '-'.(512-bindec($x));
1087:         }
1088:         return bindec($x);
1089:     }   //  function BINTODEC()
1090: 
1091: 
1092:     /**
1093:      * BINTOHEX
1094:      *
1095:      * Return a binary value as hex.
1096:      *
1097:      * Excel Function:
1098:      *      BIN2HEX(x[,places])
1099:      *
1100:      * @access  public
1101:      * @category Engineering Functions
1102:      * @param   string      $x      The binary number (as a string) that you want to convert. The number
1103:      *                              cannot contain more than 10 characters (10 bits). The most significant
1104:      *                              bit of number is the sign bit. The remaining 9 bits are magnitude bits.
1105:      *                              Negative numbers are represented using two's-complement notation.
1106:      *                              If number is not a valid binary number, or if number contains more than
1107:      *                              10 characters (10 bits), BIN2HEX returns the #NUM! error value.
1108:      * @param   integer     $places The number of characters to use. If places is omitted, BIN2HEX uses the
1109:      *                              minimum number of characters necessary. Places is useful for padding the
1110:      *                              return value with leading 0s (zeros).
1111:      *                              If places is not an integer, it is truncated.
1112:      *                              If places is nonnumeric, BIN2HEX returns the #VALUE! error value.
1113:      *                              If places is negative, BIN2HEX returns the #NUM! error value.
1114:      * @return  string
1115:      */
1116:     public static function BINTOHEX($x, $places=NULL) {
1117:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1118:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1119: 
1120:         if (is_bool($x)) {
1121:             if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
1122:                 $x = (int) $x;
1123:             } else {
1124:                 return PHPExcel_Calculation_Functions::VALUE();
1125:             }
1126:         }
1127:         if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {
1128:             $x = floor($x);
1129:         }
1130:         $x = (string) $x;
1131:         if (strlen($x) > preg_match_all('/[01]/',$x,$out)) {
1132:             return PHPExcel_Calculation_Functions::NaN();
1133:         }
1134:         if (strlen($x) > 10) {
1135:             return PHPExcel_Calculation_Functions::NaN();
1136:         } elseif (strlen($x) == 10) {
1137:             //  Two's Complement
1138:             return str_repeat('F',8).substr(strtoupper(dechex(bindec(substr($x,-9)))),-2);
1139:         }
1140:         $hexVal = (string) strtoupper(dechex(bindec($x)));
1141: 
1142:         return self::_nbrConversionFormat($hexVal,$places);
1143:     }   //  function BINTOHEX()
1144: 
1145: 
1146:     /**
1147:      * BINTOOCT
1148:      *
1149:      * Return a binary value as octal.
1150:      *
1151:      * Excel Function:
1152:      *      BIN2OCT(x[,places])
1153:      *
1154:      * @access  public
1155:      * @category Engineering Functions
1156:      * @param   string      $x      The binary number (as a string) that you want to convert. The number
1157:      *                              cannot contain more than 10 characters (10 bits). The most significant
1158:      *                              bit of number is the sign bit. The remaining 9 bits are magnitude bits.
1159:      *                              Negative numbers are represented using two's-complement notation.
1160:      *                              If number is not a valid binary number, or if number contains more than
1161:      *                              10 characters (10 bits), BIN2OCT returns the #NUM! error value.
1162:      * @param   integer     $places The number of characters to use. If places is omitted, BIN2OCT uses the
1163:      *                              minimum number of characters necessary. Places is useful for padding the
1164:      *                              return value with leading 0s (zeros).
1165:      *                              If places is not an integer, it is truncated.
1166:      *                              If places is nonnumeric, BIN2OCT returns the #VALUE! error value.
1167:      *                              If places is negative, BIN2OCT returns the #NUM! error value.
1168:      * @return  string
1169:      */
1170:     public static function BINTOOCT($x, $places=NULL) {
1171:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1172:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1173: 
1174:         if (is_bool($x)) {
1175:             if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
1176:                 $x = (int) $x;
1177:             } else {
1178:                 return PHPExcel_Calculation_Functions::VALUE();
1179:             }
1180:         }
1181:         if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) {
1182:             $x = floor($x);
1183:         }
1184:         $x = (string) $x;
1185:         if (strlen($x) > preg_match_all('/[01]/',$x,$out)) {
1186:             return PHPExcel_Calculation_Functions::NaN();
1187:         }
1188:         if (strlen($x) > 10) {
1189:             return PHPExcel_Calculation_Functions::NaN();
1190:         } elseif (strlen($x) == 10) {
1191:             //  Two's Complement
1192:             return str_repeat('7',7).substr(strtoupper(decoct(bindec(substr($x,-9)))),-3);
1193:         }
1194:         $octVal = (string) decoct(bindec($x));
1195: 
1196:         return self::_nbrConversionFormat($octVal,$places);
1197:     }   //  function BINTOOCT()
1198: 
1199: 
1200:     /**
1201:      * DECTOBIN
1202:      *
1203:      * Return a decimal value as binary.
1204:      *
1205:      * Excel Function:
1206:      *      DEC2BIN(x[,places])
1207:      *
1208:      * @access  public
1209:      * @category Engineering Functions
1210:      * @param   string      $x      The decimal integer you want to convert. If number is negative,
1211:      *                              valid place values are ignored and DEC2BIN returns a 10-character
1212:      *                              (10-bit) binary number in which the most significant bit is the sign
1213:      *                              bit. The remaining 9 bits are magnitude bits. Negative numbers are
1214:      *                              represented using two's-complement notation.
1215:      *                              If number < -512 or if number > 511, DEC2BIN returns the #NUM! error
1216:      *                              value.
1217:      *                              If number is nonnumeric, DEC2BIN returns the #VALUE! error value.
1218:      *                              If DEC2BIN requires more than places characters, it returns the #NUM!
1219:      *                              error value.
1220:      * @param   integer     $places The number of characters to use. If places is omitted, DEC2BIN uses
1221:      *                              the minimum number of characters necessary. Places is useful for
1222:      *                              padding the return value with leading 0s (zeros).
1223:      *                              If places is not an integer, it is truncated.
1224:      *                              If places is nonnumeric, DEC2BIN returns the #VALUE! error value.
1225:      *                              If places is zero or negative, DEC2BIN returns the #NUM! error value.
1226:      * @return  string
1227:      */
1228:     public static function DECTOBIN($x, $places=NULL) {
1229:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1230:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1231: 
1232:         if (is_bool($x)) {
1233:             if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
1234:                 $x = (int) $x;
1235:             } else {
1236:                 return PHPExcel_Calculation_Functions::VALUE();
1237:             }
1238:         }
1239:         $x = (string) $x;
1240:         if (strlen($x) > preg_match_all('/[-0123456789.]/',$x,$out)) {
1241:             return PHPExcel_Calculation_Functions::VALUE();
1242:         }
1243:         $x = (string) floor($x);
1244:         $r = decbin($x);
1245:         if (strlen($r) == 32) {
1246:             //  Two's Complement
1247:             $r = substr($r,-10);
1248:         } elseif (strlen($r) > 11) {
1249:             return PHPExcel_Calculation_Functions::NaN();
1250:         }
1251: 
1252:         return self::_nbrConversionFormat($r,$places);
1253:     }   //  function DECTOBIN()
1254: 
1255: 
1256:     /**
1257:      * DECTOHEX
1258:      *
1259:      * Return a decimal value as hex.
1260:      *
1261:      * Excel Function:
1262:      *      DEC2HEX(x[,places])
1263:      *
1264:      * @access  public
1265:      * @category Engineering Functions
1266:      * @param   string      $x      The decimal integer you want to convert. If number is negative,
1267:      *                              places is ignored and DEC2HEX returns a 10-character (40-bit)
1268:      *                              hexadecimal number in which the most significant bit is the sign
1269:      *                              bit. The remaining 39 bits are magnitude bits. Negative numbers
1270:      *                              are represented using two's-complement notation.
1271:      *                              If number < -549,755,813,888 or if number > 549,755,813,887,
1272:      *                              DEC2HEX returns the #NUM! error value.
1273:      *                              If number is nonnumeric, DEC2HEX returns the #VALUE! error value.
1274:      *                              If DEC2HEX requires more than places characters, it returns the
1275:      *                              #NUM! error value.
1276:      * @param   integer     $places The number of characters to use. If places is omitted, DEC2HEX uses
1277:      *                              the minimum number of characters necessary. Places is useful for
1278:      *                              padding the return value with leading 0s (zeros).
1279:      *                              If places is not an integer, it is truncated.
1280:      *                              If places is nonnumeric, DEC2HEX returns the #VALUE! error value.
1281:      *                              If places is zero or negative, DEC2HEX returns the #NUM! error value.
1282:      * @return  string
1283:      */
1284:     public static function DECTOHEX($x, $places=null) {
1285:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1286:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1287: 
1288:         if (is_bool($x)) {
1289:             if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
1290:                 $x = (int) $x;
1291:             } else {
1292:                 return PHPExcel_Calculation_Functions::VALUE();
1293:             }
1294:         }
1295:         $x = (string) $x;
1296:         if (strlen($x) > preg_match_all('/[-0123456789.]/',$x,$out)) {
1297:             return PHPExcel_Calculation_Functions::VALUE();
1298:         }
1299:         $x = (string) floor($x);
1300:         $r = strtoupper(dechex($x));
1301:         if (strlen($r) == 8) {
1302:             //  Two's Complement
1303:             $r = 'FF'.$r;
1304:         }
1305: 
1306:         return self::_nbrConversionFormat($r,$places);
1307:     }   //  function DECTOHEX()
1308: 
1309: 
1310:     /**
1311:      * DECTOOCT
1312:      *
1313:      * Return an decimal value as octal.
1314:      *
1315:      * Excel Function:
1316:      *      DEC2OCT(x[,places])
1317:      *
1318:      * @access  public
1319:      * @category Engineering Functions
1320:      * @param   string      $x      The decimal integer you want to convert. If number is negative,
1321:      *                              places is ignored and DEC2OCT returns a 10-character (30-bit)
1322:      *                              octal number in which the most significant bit is the sign bit.
1323:      *                              The remaining 29 bits are magnitude bits. Negative numbers are
1324:      *                              represented using two's-complement notation.
1325:      *                              If number < -536,870,912 or if number > 536,870,911, DEC2OCT
1326:      *                              returns the #NUM! error value.
1327:      *                              If number is nonnumeric, DEC2OCT returns the #VALUE! error value.
1328:      *                              If DEC2OCT requires more than places characters, it returns the
1329:      *                              #NUM! error value.
1330:      * @param   integer     $places The number of characters to use. If places is omitted, DEC2OCT uses
1331:      *                              the minimum number of characters necessary. Places is useful for
1332:      *                              padding the return value with leading 0s (zeros).
1333:      *                              If places is not an integer, it is truncated.
1334:      *                              If places is nonnumeric, DEC2OCT returns the #VALUE! error value.
1335:      *                              If places is zero or negative, DEC2OCT returns the #NUM! error value.
1336:      * @return  string
1337:      */
1338:     public static function DECTOOCT($x, $places=null) {
1339:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1340:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1341: 
1342:         if (is_bool($x)) {
1343:             if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) {
1344:                 $x = (int) $x;
1345:             } else {
1346:                 return PHPExcel_Calculation_Functions::VALUE();
1347:             }
1348:         }
1349:         $x = (string) $x;
1350:         if (strlen($x) > preg_match_all('/[-0123456789.]/',$x,$out)) {
1351:             return PHPExcel_Calculation_Functions::VALUE();
1352:         }
1353:         $x = (string) floor($x);
1354:         $r = decoct($x);
1355:         if (strlen($r) == 11) {
1356:             //  Two's Complement
1357:             $r = substr($r,-10);
1358:         }
1359: 
1360:         return self::_nbrConversionFormat($r,$places);
1361:     }   //  function DECTOOCT()
1362: 
1363: 
1364:     /**
1365:      * HEXTOBIN
1366:      *
1367:      * Return a hex value as binary.
1368:      *
1369:      * Excel Function:
1370:      *      HEX2BIN(x[,places])
1371:      *
1372:      * @access  public
1373:      * @category Engineering Functions
1374:      * @param   string      $x          the hexadecimal number you want to convert. Number cannot
1375:      *                                  contain more than 10 characters. The most significant bit of
1376:      *                                  number is the sign bit (40th bit from the right). The remaining
1377:      *                                  9 bits are magnitude bits. Negative numbers are represented
1378:      *                                  using two's-complement notation.
1379:      *                                  If number is negative, HEX2BIN ignores places and returns a
1380:      *                                  10-character binary number.
1381:      *                                  If number is negative, it cannot be less than FFFFFFFE00, and
1382:      *                                  if number is positive, it cannot be greater than 1FF.
1383:      *                                  If number is not a valid hexadecimal number, HEX2BIN returns
1384:      *                                  the #NUM! error value.
1385:      *                                  If HEX2BIN requires more than places characters, it returns
1386:      *                                  the #NUM! error value.
1387:      * @param   integer     $places     The number of characters to use. If places is omitted,
1388:      *                                  HEX2BIN uses the minimum number of characters necessary. Places
1389:      *                                  is useful for padding the return value with leading 0s (zeros).
1390:      *                                  If places is not an integer, it is truncated.
1391:      *                                  If places is nonnumeric, HEX2BIN returns the #VALUE! error value.
1392:      *                                  If places is negative, HEX2BIN returns the #NUM! error value.
1393:      * @return  string
1394:      */
1395:     public static function HEXTOBIN($x, $places=null) {
1396:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1397:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1398: 
1399:         if (is_bool($x)) {
1400:             return PHPExcel_Calculation_Functions::VALUE();
1401:         }
1402:         $x = (string) $x;
1403:         if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/',strtoupper($x),$out)) {
1404:             return PHPExcel_Calculation_Functions::NaN();
1405:         }
1406:         $binVal = decbin(hexdec($x));
1407: 
1408:         return substr(self::_nbrConversionFormat($binVal,$places),-10);
1409:     }   //  function HEXTOBIN()
1410: 
1411: 
1412:     /**
1413:      * HEXTODEC
1414:      *
1415:      * Return a hex value as decimal.
1416:      *
1417:      * Excel Function:
1418:      *      HEX2DEC(x)
1419:      *
1420:      * @access  public
1421:      * @category Engineering Functions
1422:      * @param   string      $x      The hexadecimal number you want to convert. This number cannot
1423:      *                              contain more than 10 characters (40 bits). The most significant
1424:      *                              bit of number is the sign bit. The remaining 39 bits are magnitude
1425:      *                              bits. Negative numbers are represented using two's-complement
1426:      *                              notation.
1427:      *                              If number is not a valid hexadecimal number, HEX2DEC returns the
1428:      *                              #NUM! error value.
1429:      * @return  string
1430:      */
1431:     public static function HEXTODEC($x) {
1432:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1433: 
1434:         if (is_bool($x)) {
1435:             return PHPExcel_Calculation_Functions::VALUE();
1436:         }
1437:         $x = (string) $x;
1438:         if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/',strtoupper($x),$out)) {
1439:             return PHPExcel_Calculation_Functions::NaN();
1440:         }
1441:         return hexdec($x);
1442:     }   //  function HEXTODEC()
1443: 
1444: 
1445:     /**
1446:      * HEXTOOCT
1447:      *
1448:      * Return a hex value as octal.
1449:      *
1450:      * Excel Function:
1451:      *      HEX2OCT(x[,places])
1452:      *
1453:      * @access  public
1454:      * @category Engineering Functions
1455:      * @param   string      $x          The hexadecimal number you want to convert. Number cannot
1456:      *                                  contain more than 10 characters. The most significant bit of
1457:      *                                  number is the sign bit. The remaining 39 bits are magnitude
1458:      *                                  bits. Negative numbers are represented using two's-complement
1459:      *                                  notation.
1460:      *                                  If number is negative, HEX2OCT ignores places and returns a
1461:      *                                  10-character octal number.
1462:      *                                  If number is negative, it cannot be less than FFE0000000, and
1463:      *                                  if number is positive, it cannot be greater than 1FFFFFFF.
1464:      *                                  If number is not a valid hexadecimal number, HEX2OCT returns
1465:      *                                  the #NUM! error value.
1466:      *                                  If HEX2OCT requires more than places characters, it returns
1467:      *                                  the #NUM! error value.
1468:      * @param   integer     $places     The number of characters to use. If places is omitted, HEX2OCT
1469:      *                                  uses the minimum number of characters necessary. Places is
1470:      *                                  useful for padding the return value with leading 0s (zeros).
1471:      *                                  If places is not an integer, it is truncated.
1472:      *                                  If places is nonnumeric, HEX2OCT returns the #VALUE! error
1473:      *                                  value.
1474:      *                                  If places is negative, HEX2OCT returns the #NUM! error value.
1475:      * @return  string
1476:      */
1477:     public static function HEXTOOCT($x, $places=null) {
1478:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1479:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1480: 
1481:         if (is_bool($x)) {
1482:             return PHPExcel_Calculation_Functions::VALUE();
1483:         }
1484:         $x = (string) $x;
1485:         if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/',strtoupper($x),$out)) {
1486:             return PHPExcel_Calculation_Functions::NaN();
1487:         }
1488:         $octVal = decoct(hexdec($x));
1489: 
1490:         return self::_nbrConversionFormat($octVal,$places);
1491:     }   //  function HEXTOOCT()
1492: 
1493: 
1494:     /**
1495:      * OCTTOBIN
1496:      *
1497:      * Return an octal value as binary.
1498:      *
1499:      * Excel Function:
1500:      *      OCT2BIN(x[,places])
1501:      *
1502:      * @access  public
1503:      * @category Engineering Functions
1504:      * @param   string      $x          The octal number you want to convert. Number may not
1505:      *                                  contain more than 10 characters. The most significant
1506:      *                                  bit of number is the sign bit. The remaining 29 bits
1507:      *                                  are magnitude bits. Negative numbers are represented
1508:      *                                  using two's-complement notation.
1509:      *                                  If number is negative, OCT2BIN ignores places and returns
1510:      *                                  a 10-character binary number.
1511:      *                                  If number is negative, it cannot be less than 7777777000,
1512:      *                                  and if number is positive, it cannot be greater than 777.
1513:      *                                  If number is not a valid octal number, OCT2BIN returns
1514:      *                                  the #NUM! error value.
1515:      *                                  If OCT2BIN requires more than places characters, it
1516:      *                                  returns the #NUM! error value.
1517:      * @param   integer     $places     The number of characters to use. If places is omitted,
1518:      *                                  OCT2BIN uses the minimum number of characters necessary.
1519:      *                                  Places is useful for padding the return value with
1520:      *                                  leading 0s (zeros).
1521:      *                                  If places is not an integer, it is truncated.
1522:      *                                  If places is nonnumeric, OCT2BIN returns the #VALUE!
1523:      *                                  error value.
1524:      *                                  If places is negative, OCT2BIN returns the #NUM! error
1525:      *                                  value.
1526:      * @return  string
1527:      */
1528:     public static function OCTTOBIN($x, $places=null) {
1529:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1530:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1531: 
1532:         if (is_bool($x)) {
1533:             return PHPExcel_Calculation_Functions::VALUE();
1534:         }
1535:         $x = (string) $x;
1536:         if (preg_match_all('/[01234567]/',$x,$out) != strlen($x)) {
1537:             return PHPExcel_Calculation_Functions::NaN();
1538:         }
1539:         $r = decbin(octdec($x));
1540: 
1541:         return self::_nbrConversionFormat($r,$places);
1542:     }   //  function OCTTOBIN()
1543: 
1544: 
1545:     /**
1546:      * OCTTODEC
1547:      *
1548:      * Return an octal value as decimal.
1549:      *
1550:      * Excel Function:
1551:      *      OCT2DEC(x)
1552:      *
1553:      * @access  public
1554:      * @category Engineering Functions
1555:      * @param   string      $x      The octal number you want to convert. Number may not contain
1556:      *                              more than 10 octal characters (30 bits). The most significant
1557:      *                              bit of number is the sign bit. The remaining 29 bits are
1558:      *                              magnitude bits. Negative numbers are represented using
1559:      *                              two's-complement notation.
1560:      *                              If number is not a valid octal number, OCT2DEC returns the
1561:      *                              #NUM! error value.
1562:      * @return  string
1563:      */
1564:     public static function OCTTODEC($x) {
1565:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1566: 
1567:         if (is_bool($x)) {
1568:             return PHPExcel_Calculation_Functions::VALUE();
1569:         }
1570:         $x = (string) $x;
1571:         if (preg_match_all('/[01234567]/',$x,$out) != strlen($x)) {
1572:             return PHPExcel_Calculation_Functions::NaN();
1573:         }
1574:         return octdec($x);
1575:     }   //  function OCTTODEC()
1576: 
1577: 
1578:     /**
1579:      * OCTTOHEX
1580:      *
1581:      * Return an octal value as hex.
1582:      *
1583:      * Excel Function:
1584:      *      OCT2HEX(x[,places])
1585:      *
1586:      * @access  public
1587:      * @category Engineering Functions
1588:      * @param   string      $x          The octal number you want to convert. Number may not contain
1589:      *                                  more than 10 octal characters (30 bits). The most significant
1590:      *                                  bit of number is the sign bit. The remaining 29 bits are
1591:      *                                  magnitude bits. Negative numbers are represented using
1592:      *                                  two's-complement notation.
1593:      *                                  If number is negative, OCT2HEX ignores places and returns a
1594:      *                                  10-character hexadecimal number.
1595:      *                                  If number is not a valid octal number, OCT2HEX returns the
1596:      *                                  #NUM! error value.
1597:      *                                  If OCT2HEX requires more than places characters, it returns
1598:      *                                  the #NUM! error value.
1599:      * @param   integer     $places     The number of characters to use. If places is omitted, OCT2HEX
1600:      *                                  uses the minimum number of characters necessary. Places is useful
1601:      *                                  for padding the return value with leading 0s (zeros).
1602:      *                                  If places is not an integer, it is truncated.
1603:      *                                  If places is nonnumeric, OCT2HEX returns the #VALUE! error value.
1604:      *                                  If places is negative, OCT2HEX returns the #NUM! error value.
1605:      * @return  string
1606:      */
1607:     public static function OCTTOHEX($x, $places=null) {
1608:         $x  = PHPExcel_Calculation_Functions::flattenSingleValue($x);
1609:         $places = PHPExcel_Calculation_Functions::flattenSingleValue($places);
1610: 
1611:         if (is_bool($x)) {
1612:             return PHPExcel_Calculation_Functions::VALUE();
1613:         }
1614:         $x = (string) $x;
1615:         if (preg_match_all('/[01234567]/',$x,$out) != strlen($x)) {
1616:             return PHPExcel_Calculation_Functions::NaN();
1617:         }
1618:         $hexVal = strtoupper(dechex(octdec($x)));
1619: 
1620:         return self::_nbrConversionFormat($hexVal,$places);
1621:     }   //  function OCTTOHEX()
1622: 
1623: 
1624:     /**
1625:      * COMPLEX
1626:      *
1627:      * Converts real and imaginary coefficients into a complex number of the form x + yi or x + yj.
1628:      *
1629:      * Excel Function:
1630:      *      COMPLEX(realNumber,imaginary[,places])
1631:      *
1632:      * @access  public
1633:      * @category Engineering Functions
1634:      * @param   float       $realNumber     The real coefficient of the complex number.
1635:      * @param   float       $imaginary      The imaginary coefficient of the complex number.
1636:      * @param   string      $suffix         The suffix for the imaginary component of the complex number.
1637:      *                                      If omitted, the suffix is assumed to be "i".
1638:      * @return  string
1639:      */
1640:     public static function COMPLEX($realNumber=0.0, $imaginary=0.0, $suffix='i') {
1641:         $realNumber = (is_null($realNumber))    ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($realNumber);
1642:         $imaginary  = (is_null($imaginary))     ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($imaginary);
1643:         $suffix     = (is_null($suffix))        ? 'i' : PHPExcel_Calculation_Functions::flattenSingleValue($suffix);
1644: 
1645:         if (((is_numeric($realNumber)) && (is_numeric($imaginary))) &&
1646:             (($suffix == 'i') || ($suffix == 'j') || ($suffix == ''))) {
1647:             $realNumber = (float) $realNumber;
1648:             $imaginary  = (float) $imaginary;
1649: 
1650:             if ($suffix == '') $suffix = 'i';
1651:             if ($realNumber == 0.0) {
1652:                 if ($imaginary == 0.0) {
1653:                     return (string) '0';
1654:                 } elseif ($imaginary == 1.0) {
1655:                     return (string) $suffix;
1656:                 } elseif ($imaginary == -1.0) {
1657:                     return (string) '-'.$suffix;
1658:                 }
1659:                 return (string) $imaginary.$suffix;
1660:             } elseif ($imaginary == 0.0) {
1661:                 return (string) $realNumber;
1662:             } elseif ($imaginary == 1.0) {
1663:                 return (string) $realNumber.'+'.$suffix;
1664:             } elseif ($imaginary == -1.0) {
1665:                 return (string) $realNumber.'-'.$suffix;
1666:             }
1667:             if ($imaginary > 0) { $imaginary = (string) '+'.$imaginary; }
1668:             return (string) $realNumber.$imaginary.$suffix;
1669:         }
1670: 
1671:         return PHPExcel_Calculation_Functions::VALUE();
1672:     }   //  function COMPLEX()
1673: 
1674: 
1675:     /**
1676:      * IMAGINARY
1677:      *
1678:      * Returns the imaginary coefficient of a complex number in x + yi or x + yj text format.
1679:      *
1680:      * Excel Function:
1681:      *      IMAGINARY(complexNumber)
1682:      *
1683:      * @access  public
1684:      * @category Engineering Functions
1685:      * @param   string      $complexNumber  The complex number for which you want the imaginary
1686:      *                                      coefficient.
1687:      * @return  float
1688:      */
1689:     public static function IMAGINARY($complexNumber) {
1690:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1691: 
1692:         $parsedComplex = self::_parseComplex($complexNumber);
1693:         return $parsedComplex['imaginary'];
1694:     }   //  function IMAGINARY()
1695: 
1696: 
1697:     /**
1698:      * IMREAL
1699:      *
1700:      * Returns the real coefficient of a complex number in x + yi or x + yj text format.
1701:      *
1702:      * Excel Function:
1703:      *      IMREAL(complexNumber)
1704:      *
1705:      * @access  public
1706:      * @category Engineering Functions
1707:      * @param   string      $complexNumber  The complex number for which you want the real coefficient.
1708:      * @return  float
1709:      */
1710:     public static function IMREAL($complexNumber) {
1711:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1712: 
1713:         $parsedComplex = self::_parseComplex($complexNumber);
1714:         return $parsedComplex['real'];
1715:     }   //  function IMREAL()
1716: 
1717: 
1718:     /**
1719:      * IMABS
1720:      *
1721:      * Returns the absolute value (modulus) of a complex number in x + yi or x + yj text format.
1722:      *
1723:      * Excel Function:
1724:      *      IMABS(complexNumber)
1725:      *
1726:      * @param   string      $complexNumber  The complex number for which you want the absolute value.
1727:      * @return  float
1728:      */
1729:     public static function IMABS($complexNumber) {
1730:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1731: 
1732:         $parsedComplex = self::_parseComplex($complexNumber);
1733: 
1734:         return sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']));
1735:     }   //  function IMABS()
1736: 
1737: 
1738:     /**
1739:      * IMARGUMENT
1740:      *
1741:      * Returns the argument theta of a complex number, i.e. the angle in radians from the real
1742:      * axis to the representation of the number in polar coordinates.
1743:      *
1744:      * Excel Function:
1745:      *      IMARGUMENT(complexNumber)
1746:      *
1747:      * @param   string      $complexNumber  The complex number for which you want the argument theta.
1748:      * @return  float
1749:      */
1750:     public static function IMARGUMENT($complexNumber) {
1751:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1752: 
1753:         $parsedComplex = self::_parseComplex($complexNumber);
1754: 
1755:         if ($parsedComplex['real'] == 0.0) {
1756:             if ($parsedComplex['imaginary'] == 0.0) {
1757:                 return 0.0;
1758:             } elseif($parsedComplex['imaginary'] < 0.0) {
1759:                 return M_PI / -2;
1760:             } else {
1761:                 return M_PI / 2;
1762:             }
1763:         } elseif ($parsedComplex['real'] > 0.0) {
1764:             return atan($parsedComplex['imaginary'] / $parsedComplex['real']);
1765:         } elseif ($parsedComplex['imaginary'] < 0.0) {
1766:             return 0 - (M_PI - atan(abs($parsedComplex['imaginary']) / abs($parsedComplex['real'])));
1767:         } else {
1768:             return M_PI - atan($parsedComplex['imaginary'] / abs($parsedComplex['real']));
1769:         }
1770:     }   //  function IMARGUMENT()
1771: 
1772: 
1773:     /**
1774:      * IMCONJUGATE
1775:      *
1776:      * Returns the complex conjugate of a complex number in x + yi or x + yj text format.
1777:      *
1778:      * Excel Function:
1779:      *      IMCONJUGATE(complexNumber)
1780:      *
1781:      * @param   string      $complexNumber  The complex number for which you want the conjugate.
1782:      * @return  string
1783:      */
1784:     public static function IMCONJUGATE($complexNumber) {
1785:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1786: 
1787:         $parsedComplex = self::_parseComplex($complexNumber);
1788: 
1789:         if ($parsedComplex['imaginary'] == 0.0) {
1790:             return $parsedComplex['real'];
1791:         } else {
1792:             return self::_cleanComplex( self::COMPLEX( $parsedComplex['real'],
1793:                                                        0 - $parsedComplex['imaginary'],
1794:                                                        $parsedComplex['suffix']
1795:                                                      )
1796:                                       );
1797:         }
1798:     }   //  function IMCONJUGATE()
1799: 
1800: 
1801:     /**
1802:      * IMCOS
1803:      *
1804:      * Returns the cosine of a complex number in x + yi or x + yj text format.
1805:      *
1806:      * Excel Function:
1807:      *      IMCOS(complexNumber)
1808:      *
1809:      * @param   string      $complexNumber  The complex number for which you want the cosine.
1810:      * @return  string|float
1811:      */
1812:     public static function IMCOS($complexNumber) {
1813:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1814: 
1815:         $parsedComplex = self::_parseComplex($complexNumber);
1816: 
1817:         if ($parsedComplex['imaginary'] == 0.0) {
1818:             return cos($parsedComplex['real']);
1819:         } else {
1820:             return self::IMCONJUGATE(self::COMPLEX(cos($parsedComplex['real']) * cosh($parsedComplex['imaginary']),sin($parsedComplex['real']) * sinh($parsedComplex['imaginary']),$parsedComplex['suffix']));
1821:         }
1822:     }   //  function IMCOS()
1823: 
1824: 
1825:     /**
1826:      * IMSIN
1827:      *
1828:      * Returns the sine of a complex number in x + yi or x + yj text format.
1829:      *
1830:      * Excel Function:
1831:      *      IMSIN(complexNumber)
1832:      *
1833:      * @param   string      $complexNumber  The complex number for which you want the sine.
1834:      * @return  string|float
1835:      */
1836:     public static function IMSIN($complexNumber) {
1837:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1838: 
1839:         $parsedComplex = self::_parseComplex($complexNumber);
1840: 
1841:         if ($parsedComplex['imaginary'] == 0.0) {
1842:             return sin($parsedComplex['real']);
1843:         } else {
1844:             return self::COMPLEX(sin($parsedComplex['real']) * cosh($parsedComplex['imaginary']),cos($parsedComplex['real']) * sinh($parsedComplex['imaginary']),$parsedComplex['suffix']);
1845:         }
1846:     }   //  function IMSIN()
1847: 
1848: 
1849:     /**
1850:      * IMSQRT
1851:      *
1852:      * Returns the square root of a complex number in x + yi or x + yj text format.
1853:      *
1854:      * Excel Function:
1855:      *      IMSQRT(complexNumber)
1856:      *
1857:      * @param   string      $complexNumber  The complex number for which you want the square root.
1858:      * @return  string
1859:      */
1860:     public static function IMSQRT($complexNumber) {
1861:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1862: 
1863:         $parsedComplex = self::_parseComplex($complexNumber);
1864: 
1865:         $theta = self::IMARGUMENT($complexNumber);
1866:         $d1 = cos($theta / 2);
1867:         $d2 = sin($theta / 2);
1868:         $r = sqrt(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])));
1869: 
1870:         if ($parsedComplex['suffix'] == '') {
1871:             return self::COMPLEX($d1 * $r,$d2 * $r);
1872:         } else {
1873:             return self::COMPLEX($d1 * $r,$d2 * $r,$parsedComplex['suffix']);
1874:         }
1875:     }   //  function IMSQRT()
1876: 
1877: 
1878:     /**
1879:      * IMLN
1880:      *
1881:      * Returns the natural logarithm of a complex number in x + yi or x + yj text format.
1882:      *
1883:      * Excel Function:
1884:      *      IMLN(complexNumber)
1885:      *
1886:      * @param   string      $complexNumber  The complex number for which you want the natural logarithm.
1887:      * @return  string
1888:      */
1889:     public static function IMLN($complexNumber) {
1890:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1891: 
1892:         $parsedComplex = self::_parseComplex($complexNumber);
1893: 
1894:         if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {
1895:             return PHPExcel_Calculation_Functions::NaN();
1896:         }
1897: 
1898:         $logR = log(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])));
1899:         $t = self::IMARGUMENT($complexNumber);
1900: 
1901:         if ($parsedComplex['suffix'] == '') {
1902:             return self::COMPLEX($logR,$t);
1903:         } else {
1904:             return self::COMPLEX($logR,$t,$parsedComplex['suffix']);
1905:         }
1906:     }   //  function IMLN()
1907: 
1908: 
1909:     /**
1910:      * IMLOG10
1911:      *
1912:      * Returns the common logarithm (base 10) of a complex number in x + yi or x + yj text format.
1913:      *
1914:      * Excel Function:
1915:      *      IMLOG10(complexNumber)
1916:      *
1917:      * @param   string      $complexNumber  The complex number for which you want the common logarithm.
1918:      * @return  string
1919:      */
1920:     public static function IMLOG10($complexNumber) {
1921:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1922: 
1923:         $parsedComplex = self::_parseComplex($complexNumber);
1924: 
1925:         if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {
1926:             return PHPExcel_Calculation_Functions::NaN();
1927:         } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) {
1928:             return log10($parsedComplex['real']);
1929:         }
1930: 
1931:         return self::IMPRODUCT(log10(EULER),self::IMLN($complexNumber));
1932:     }   //  function IMLOG10()
1933: 
1934: 
1935:     /**
1936:      * IMLOG2
1937:      *
1938:      * Returns the base-2 logarithm of a complex number in x + yi or x + yj text format.
1939:      *
1940:      * Excel Function:
1941:      *      IMLOG2(complexNumber)
1942:      *
1943:      * @param   string      $complexNumber  The complex number for which you want the base-2 logarithm.
1944:      * @return  string
1945:      */
1946:     public static function IMLOG2($complexNumber) {
1947:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1948: 
1949:         $parsedComplex = self::_parseComplex($complexNumber);
1950: 
1951:         if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {
1952:             return PHPExcel_Calculation_Functions::NaN();
1953:         } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) {
1954:             return log($parsedComplex['real'],2);
1955:         }
1956: 
1957:         return self::IMPRODUCT(log(EULER,2),self::IMLN($complexNumber));
1958:     }   //  function IMLOG2()
1959: 
1960: 
1961:     /**
1962:      * IMEXP
1963:      *
1964:      * Returns the exponential of a complex number in x + yi or x + yj text format.
1965:      *
1966:      * Excel Function:
1967:      *      IMEXP(complexNumber)
1968:      *
1969:      * @param   string      $complexNumber  The complex number for which you want the exponential.
1970:      * @return  string
1971:      */
1972:     public static function IMEXP($complexNumber) {
1973:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
1974: 
1975:         $parsedComplex = self::_parseComplex($complexNumber);
1976: 
1977:         if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) {
1978:             return '1';
1979:         }
1980: 
1981:         $e = exp($parsedComplex['real']);
1982:         $eX = $e * cos($parsedComplex['imaginary']);
1983:         $eY = $e * sin($parsedComplex['imaginary']);
1984: 
1985:         if ($parsedComplex['suffix'] == '') {
1986:             return self::COMPLEX($eX,$eY);
1987:         } else {
1988:             return self::COMPLEX($eX,$eY,$parsedComplex['suffix']);
1989:         }
1990:     }   //  function IMEXP()
1991: 
1992: 
1993:     /**
1994:      * IMPOWER
1995:      *
1996:      * Returns a complex number in x + yi or x + yj text format raised to a power.
1997:      *
1998:      * Excel Function:
1999:      *      IMPOWER(complexNumber,realNumber)
2000:      *
2001:      * @param   string      $complexNumber  The complex number you want to raise to a power.
2002:      * @param   float       $realNumber     The power to which you want to raise the complex number.
2003:      * @return  string
2004:      */
2005:     public static function IMPOWER($complexNumber,$realNumber) {
2006:         $complexNumber  = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber);
2007:         $realNumber     = PHPExcel_Calculation_Functions::flattenSingleValue($realNumber);
2008: 
2009:         if (!is_numeric($realNumber)) {
2010:             return PHPExcel_Calculation_Functions::VALUE();
2011:         }
2012: 
2013:         $parsedComplex = self::_parseComplex($complexNumber);
2014: 
2015:         $r = sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']));
2016:         $rPower = pow($r,$realNumber);
2017:         $theta = self::IMARGUMENT($complexNumber) * $realNumber;
2018:         if ($theta == 0) {
2019:             return 1;
2020:         } elseif ($parsedComplex['imaginary'] == 0.0) {
2021:             return self::COMPLEX($rPower * cos($theta),$rPower * sin($theta),$parsedComplex['suffix']);
2022:         } else {
2023:             return self::COMPLEX($rPower * cos($theta),$rPower * sin($theta),$parsedComplex['suffix']);
2024:         }
2025:     }   //  function IMPOWER()
2026: 
2027: 
2028:     /**
2029:      * IMDIV
2030:      *
2031:      * Returns the quotient of two complex numbers in x + yi or x + yj text format.
2032:      *
2033:      * Excel Function:
2034:      *      IMDIV(complexDividend,complexDivisor)
2035:      *
2036:      * @param   string      $complexDividend    The complex numerator or dividend.
2037:      * @param   string      $complexDivisor     The complex denominator or divisor.
2038:      * @return  string
2039:      */
2040:     public static function IMDIV($complexDividend,$complexDivisor) {
2041:         $complexDividend    = PHPExcel_Calculation_Functions::flattenSingleValue($complexDividend);
2042:         $complexDivisor = PHPExcel_Calculation_Functions::flattenSingleValue($complexDivisor);
2043: 
2044:         $parsedComplexDividend = self::_parseComplex($complexDividend);
2045:         $parsedComplexDivisor = self::_parseComplex($complexDivisor);
2046: 
2047:         if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] != '') &&
2048:             ($parsedComplexDividend['suffix'] != $parsedComplexDivisor['suffix'])) {
2049:             return PHPExcel_Calculation_Functions::NaN();
2050:         }
2051:         if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] == '')) {
2052:             $parsedComplexDivisor['suffix'] = $parsedComplexDividend['suffix'];
2053:         }
2054: 
2055:         $d1 = ($parsedComplexDividend['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['imaginary']);
2056:         $d2 = ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['real']) - ($parsedComplexDividend['real'] * $parsedComplexDivisor['imaginary']);
2057:         $d3 = ($parsedComplexDivisor['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDivisor['imaginary'] * $parsedComplexDivisor['imaginary']);
2058: 
2059:         $r = $d1/$d3;
2060:         $i = $d2/$d3;
2061: 
2062:         if ($i > 0.0) {
2063:             return self::_cleanComplex($r.'+'.$i.$parsedComplexDivisor['suffix']);
2064:         } elseif ($i < 0.0) {
2065:             return self::_cleanComplex($r.$i.$parsedComplexDivisor['suffix']);
2066:         } else {
2067:             return $r;
2068:         }
2069:     }   //  function IMDIV()
2070: 
2071: 
2072:     /**
2073:      * IMSUB
2074:      *
2075:      * Returns the difference of two complex numbers in x + yi or x + yj text format.
2076:      *
2077:      * Excel Function:
2078:      *      IMSUB(complexNumber1,complexNumber2)
2079:      *
2080:      * @param   string      $complexNumber1     The complex number from which to subtract complexNumber2.
2081:      * @param   string      $complexNumber2     The complex number to subtract from complexNumber1.
2082:      * @return  string
2083:      */
2084:     public static function IMSUB($complexNumber1,$complexNumber2) {
2085:         $complexNumber1 = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber1);
2086:         $complexNumber2 = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber2);
2087: 
2088:         $parsedComplex1 = self::_parseComplex($complexNumber1);
2089:         $parsedComplex2 = self::_parseComplex($complexNumber2);
2090: 
2091:         if ((($parsedComplex1['suffix'] != '') && ($parsedComplex2['suffix'] != '')) &&
2092:             ($parsedComplex1['suffix'] != $parsedComplex2['suffix'])) {
2093:             return PHPExcel_Calculation_Functions::NaN();
2094:         } elseif (($parsedComplex1['suffix'] == '') && ($parsedComplex2['suffix'] != '')) {
2095:             $parsedComplex1['suffix'] = $parsedComplex2['suffix'];
2096:         }
2097: 
2098:         $d1 = $parsedComplex1['real'] - $parsedComplex2['real'];
2099:         $d2 = $parsedComplex1['imaginary'] - $parsedComplex2['imaginary'];
2100: 
2101:         return self::COMPLEX($d1,$d2,$parsedComplex1['suffix']);
2102:     }   //  function IMSUB()
2103: 
2104: 
2105:     /**
2106:      * IMSUM
2107:      *
2108:      * Returns the sum of two or more complex numbers in x + yi or x + yj text format.
2109:      *
2110:      * Excel Function:
2111:      *      IMSUM(complexNumber[,complexNumber[,...]])
2112:      *
2113:      * @param   string      $complexNumber,...  Series of complex numbers to add
2114:      * @return  string
2115:      */
2116:     public static function IMSUM() {
2117:         // Return value
2118:         $returnValue = self::_parseComplex('0');
2119:         $activeSuffix = '';
2120: 
2121:         // Loop through the arguments
2122:         $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());
2123:         foreach ($aArgs as $arg) {
2124:             $parsedComplex = self::_parseComplex($arg);
2125: 
2126:             if ($activeSuffix == '') {
2127:                 $activeSuffix = $parsedComplex['suffix'];
2128:             } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) {
2129:                 return PHPExcel_Calculation_Functions::VALUE();
2130:             }
2131: 
2132:             $returnValue['real'] += $parsedComplex['real'];
2133:             $returnValue['imaginary'] += $parsedComplex['imaginary'];
2134:         }
2135: 
2136:         if ($returnValue['imaginary'] == 0.0) { $activeSuffix = ''; }
2137:         return self::COMPLEX($returnValue['real'],$returnValue['imaginary'],$activeSuffix);
2138:     }   //  function IMSUM()
2139: 
2140: 
2141:     /**
2142:      * IMPRODUCT
2143:      *
2144:      * Returns the product of two or more complex numbers in x + yi or x + yj text format.
2145:      *
2146:      * Excel Function:
2147:      *      IMPRODUCT(complexNumber[,complexNumber[,...]])
2148:      *
2149:      * @param   string      $complexNumber,...  Series of complex numbers to multiply
2150:      * @return  string
2151:      */
2152:     public static function IMPRODUCT() {
2153:         // Return value
2154:         $returnValue = self::_parseComplex('1');
2155:         $activeSuffix = '';
2156: 
2157:         // Loop through the arguments
2158:         $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args());
2159:         foreach ($aArgs as $arg) {
2160:             $parsedComplex = self::_parseComplex($arg);
2161: 
2162:             $workValue = $returnValue;
2163:             if (($parsedComplex['suffix'] != '') && ($activeSuffix == '')) {
2164:                 $activeSuffix = $parsedComplex['suffix'];
2165:             } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) {
2166:                 return PHPExcel_Calculation_Functions::NaN();
2167:             }
2168:             $returnValue['real'] = ($workValue['real'] * $parsedComplex['real']) - ($workValue['imaginary'] * $parsedComplex['imaginary']);
2169:             $returnValue['imaginary'] = ($workValue['real'] * $parsedComplex['imaginary']) + ($workValue['imaginary'] * $parsedComplex['real']);
2170:         }
2171: 
2172:         if ($returnValue['imaginary'] == 0.0) { $activeSuffix = ''; }
2173:         return self::COMPLEX($returnValue['real'],$returnValue['imaginary'],$activeSuffix);
2174:     }   //  function IMPRODUCT()
2175: 
2176: 
2177:     /**
2178:      *  DELTA
2179:      *
2180:      *  Tests whether two values are equal. Returns 1 if number1 = number2; returns 0 otherwise.
2181:      *  Use this function to filter a set of values. For example, by summing several DELTA
2182:      *  functions you calculate the count of equal pairs. This function is also known as the
2183:      *  Kronecker Delta function.
2184:      *
2185:      *  Excel Function:
2186:      *      DELTA(a[,b])
2187:      *
2188:      *  @param  float       $a  The first number.
2189:      *  @param  float       $b  The second number. If omitted, b is assumed to be zero.
2190:      *  @return int
2191:      */
2192:     public static function DELTA($a, $b=0) {
2193:         $a  = PHPExcel_Calculation_Functions::flattenSingleValue($a);
2194:         $b  = PHPExcel_Calculation_Functions::flattenSingleValue($b);
2195: 
2196:         return (int) ($a == $b);
2197:     }   //  function DELTA()
2198: 
2199: 
2200:     /**
2201:      *  GESTEP
2202:      *
2203:      *  Excel Function:
2204:      *      GESTEP(number[,step])
2205:      *
2206:      *  Returns 1 if number >= step; returns 0 (zero) otherwise
2207:      *  Use this function to filter a set of values. For example, by summing several GESTEP
2208:      *  functions you calculate the count of values that exceed a threshold.
2209:      *
2210:      *  @param  float       $number     The value to test against step.
2211:      *  @param  float       $step       The threshold value.
2212:      *                                  If you omit a value for step, GESTEP uses zero.
2213:      *  @return int
2214:      */
2215:     public static function GESTEP($number, $step=0) {
2216:         $number = PHPExcel_Calculation_Functions::flattenSingleValue($number);
2217:         $step   = PHPExcel_Calculation_Functions::flattenSingleValue($step);
2218: 
2219:         return (int) ($number >= $step);
2220:     }   //  function GESTEP()
2221: 
2222: 
2223:     //
2224:     //  Private method to calculate the erf value
2225:     //
2226:     private static $_two_sqrtpi = 1.128379167095512574;
2227: 
2228:     public static function _erfVal($x) {
2229:         if (abs($x) > 2.2) {
2230:             return 1 - self::_erfcVal($x);
2231:         }
2232:         $sum = $term = $x;
2233:         $xsqr = ($x * $x);
2234:         $j = 1;
2235:         do {
2236:             $term *= $xsqr / $j;
2237:             $sum -= $term / (2 * $j + 1);
2238:             ++$j;
2239:             $term *= $xsqr / $j;
2240:             $sum += $term / (2 * $j + 1);
2241:             ++$j;
2242:             if ($sum == 0.0) {
2243:                 break;
2244:             }
2245:         } while (abs($term / $sum) > PRECISION);
2246:         return self::$_two_sqrtpi * $sum;
2247:     }   //  function _erfVal()
2248: 
2249: 
2250:     /**
2251:      *  ERF
2252:      *
2253:      *  Returns the error function integrated between the lower and upper bound arguments.
2254:      *
2255:      *  Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments,
2256:      *          the function would return a #NUM! error. However, in Excel 2010, the function algorithm was
2257:      *          improved, so that it can now calculate the function for both positive and negative ranges.
2258:      *          PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments.
2259:      *
2260:      *  Excel Function:
2261:      *      ERF(lower[,upper])
2262:      *
2263:      *  @param  float       $lower  lower bound for integrating ERF
2264:      *  @param  float       $upper  upper bound for integrating ERF.
2265:      *                              If omitted, ERF integrates between zero and lower_limit
2266:      *  @return float
2267:      */
2268:     public static function ERF($lower, $upper = NULL) {
2269:         $lower  = PHPExcel_Calculation_Functions::flattenSingleValue($lower);
2270:         $upper  = PHPExcel_Calculation_Functions::flattenSingleValue($upper);
2271: 
2272:         if (is_numeric($lower)) {
2273:             if (is_null($upper)) {
2274:                 return self::_erfVal($lower);
2275:             }
2276:             if (is_numeric($upper)) {
2277:                 return self::_erfVal($upper) - self::_erfVal($lower);
2278:             }
2279:         }
2280:         return PHPExcel_Calculation_Functions::VALUE();
2281:     }   //  function ERF()
2282: 
2283: 
2284:     //
2285:     //  Private method to calculate the erfc value
2286:     //
2287:     private static $_one_sqrtpi = 0.564189583547756287;
2288: 
2289:     private static function _erfcVal($x) {
2290:         if (abs($x) < 2.2) {
2291:             return 1 - self::_erfVal($x);
2292:         }
2293:         if ($x < 0) {
2294:             return 2 - self::ERFC(-$x);
2295:         }
2296:         $a = $n = 1;
2297:         $b = $c = $x;
2298:         $d = ($x * $x) + 0.5;
2299:         $q1 = $q2 = $b / $d;
2300:         $t = 0;
2301:         do {
2302:             $t = $a * $n + $b * $x;
2303:             $a = $b;
2304:             $b = $t;
2305:             $t = $c * $n + $d * $x;
2306:             $c = $d;
2307:             $d = $t;
2308:             $n += 0.5;
2309:             $q1 = $q2;
2310:             $q2 = $b / $d;
2311:         } while ((abs($q1 - $q2) / $q2) > PRECISION);
2312:         return self::$_one_sqrtpi * exp(-$x * $x) * $q2;
2313:     }   //  function _erfcVal()
2314: 
2315: 
2316:     /**
2317:      *  ERFC
2318:      *
2319:      *  Returns the complementary ERF function integrated between x and infinity
2320:      *
2321:      *  Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument,
2322:      *      the function would return a #NUM! error. However, in Excel 2010, the function algorithm was
2323:      *      improved, so that it can now calculate the function for both positive and negative x values.
2324:      *          PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments.
2325:      *
2326:      *  Excel Function:
2327:      *      ERFC(x)
2328:      *
2329:      *  @param  float   $x  The lower bound for integrating ERFC
2330:      *  @return float
2331:      */
2332:     public static function ERFC($x) {
2333:         $x = PHPExcel_Calculation_Functions::flattenSingleValue($x);
2334: 
2335:         if (is_numeric($x)) {
2336:             return self::_erfcVal($x);
2337:         }
2338:         return PHPExcel_Calculation_Functions::VALUE();
2339:     }   //  function ERFC()
2340: 
2341: 
2342:     /**
2343:      *  getConversionGroups
2344:      *  Returns a list of the different conversion groups for UOM conversions
2345:      *
2346:      *  @return array
2347:      */
2348:     public static function getConversionGroups() {
2349:         $conversionGroups = array();
2350:         foreach(self::$_conversionUnits as $conversionUnit) {
2351:             $conversionGroups[] = $conversionUnit['Group'];
2352:         }
2353:         return array_merge(array_unique($conversionGroups));
2354:     }   //  function getConversionGroups()
2355: 
2356: 
2357:     /**
2358:      *  getConversionGroupUnits
2359:      *  Returns an array of units of measure, for a specified conversion group, or for all groups
2360:      *
2361:      *  @param  string  $group  The group whose units of measure you want to retrieve
2362:      *  @return array
2363:      */
2364:     public static function getConversionGroupUnits($group = NULL) {
2365:         $conversionGroups = array();
2366:         foreach(self::$_conversionUnits as $conversionUnit => $conversionGroup) {
2367:             if ((is_null($group)) || ($conversionGroup['Group'] == $group)) {
2368:                 $conversionGroups[$conversionGroup['Group']][] = $conversionUnit;
2369:             }
2370:         }
2371:         return $conversionGroups;
2372:     }   //  function getConversionGroupUnits()
2373: 
2374: 
2375:     /**
2376:      *  getConversionGroupUnitDetails
2377:      *
2378:      *  @param  string  $group  The group whose units of measure you want to retrieve
2379:      *  @return array
2380:      */
2381:     public static function getConversionGroupUnitDetails($group = NULL) {
2382:         $conversionGroups = array();
2383:         foreach(self::$_conversionUnits as $conversionUnit => $conversionGroup) {
2384:             if ((is_null($group)) || ($conversionGroup['Group'] == $group)) {
2385:                 $conversionGroups[$conversionGroup['Group']][] = array( 'unit'          => $conversionUnit,
2386:                                                                         'description'   => $conversionGroup['Unit Name']
2387:                                                                       );
2388:             }
2389:         }
2390:         return $conversionGroups;
2391:     }   //  function getConversionGroupUnitDetails()
2392: 
2393: 
2394:     /**
2395:      *  getConversionMultipliers
2396:      *  Returns an array of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM()
2397:      *
2398:      *  @return array of mixed
2399:      */
2400:     public static function getConversionMultipliers() {
2401:         return self::$_conversionMultipliers;
2402:     }   //  function getConversionGroups()
2403: 
2404: 
2405:     /**
2406:      *  CONVERTUOM
2407:      *
2408:      *  Converts a number from one measurement system to another.
2409:      *  For example, CONVERT can translate a table of distances in miles to a table of distances
2410:      *  in kilometers.
2411:      *
2412:      *  Excel Function:
2413:      *      CONVERT(value,fromUOM,toUOM)
2414:      *
2415:      *  @param  float       $value      The value in fromUOM to convert.
2416:      *  @param  string      $fromUOM    The units for value.
2417:      *  @param  string      $toUOM      The units for the result.
2418:      *
2419:      *  @return float
2420:      */
2421:     public static function CONVERTUOM($value, $fromUOM, $toUOM) {
2422:         $value      = PHPExcel_Calculation_Functions::flattenSingleValue($value);
2423:         $fromUOM    = PHPExcel_Calculation_Functions::flattenSingleValue($fromUOM);
2424:         $toUOM      = PHPExcel_Calculation_Functions::flattenSingleValue($toUOM);
2425: 
2426:         if (!is_numeric($value)) {
2427:             return PHPExcel_Calculation_Functions::VALUE();
2428:         }
2429:         $fromMultiplier = 1.0;
2430:         if (isset(self::$_conversionUnits[$fromUOM])) {
2431:             $unitGroup1 = self::$_conversionUnits[$fromUOM]['Group'];
2432:         } else {
2433:             $fromMultiplier = substr($fromUOM,0,1);
2434:             $fromUOM = substr($fromUOM,1);
2435:             if (isset(self::$_conversionMultipliers[$fromMultiplier])) {
2436:                 $fromMultiplier = self::$_conversionMultipliers[$fromMultiplier]['multiplier'];
2437:             } else {
2438:                 return PHPExcel_Calculation_Functions::NA();
2439:             }
2440:             if ((isset(self::$_conversionUnits[$fromUOM])) && (self::$_conversionUnits[$fromUOM]['AllowPrefix'])) {
2441:                 $unitGroup1 = self::$_conversionUnits[$fromUOM]['Group'];
2442:             } else {
2443:                 return PHPExcel_Calculation_Functions::NA();
2444:             }
2445:         }
2446:         $value *= $fromMultiplier;
2447: 
2448:         $toMultiplier = 1.0;
2449:         if (isset(self::$_conversionUnits[$toUOM])) {
2450:             $unitGroup2 = self::$_conversionUnits[$toUOM]['Group'];
2451:         } else {
2452:             $toMultiplier = substr($toUOM,0,1);
2453:             $toUOM = substr($toUOM,1);
2454:             if (isset(self::$_conversionMultipliers[$toMultiplier])) {
2455:                 $toMultiplier = self::$_conversionMultipliers[$toMultiplier]['multiplier'];
2456:             } else {
2457:                 return PHPExcel_Calculation_Functions::NA();
2458:             }
2459:             if ((isset(self::$_conversionUnits[$toUOM])) && (self::$_conversionUnits[$toUOM]['AllowPrefix'])) {
2460:                 $unitGroup2 = self::$_conversionUnits[$toUOM]['Group'];
2461:             } else {
2462:                 return PHPExcel_Calculation_Functions::NA();
2463:             }
2464:         }
2465:         if ($unitGroup1 != $unitGroup2) {
2466:             return PHPExcel_Calculation_Functions::NA();
2467:         }
2468: 
2469:         if (($fromUOM == $toUOM) && ($fromMultiplier == $toMultiplier)) {
2470:             //  We've already factored $fromMultiplier into the value, so we need
2471:             //      to reverse it again
2472:             return $value / $fromMultiplier;
2473:         } elseif ($unitGroup1 == 'Temperature') {
2474:             if (($fromUOM == 'F') || ($fromUOM == 'fah')) {
2475:                 if (($toUOM == 'F') || ($toUOM == 'fah')) {
2476:                     return $value;
2477:                 } else {
2478:                     $value = (($value - 32) / 1.8);
2479:                     if (($toUOM == 'K') || ($toUOM == 'kel')) {
2480:                         $value += 273.15;
2481:                     }
2482:                     return $value;
2483:                 }
2484:             } elseif ((($fromUOM == 'K') || ($fromUOM == 'kel')) &&
2485:                       (($toUOM == 'K') || ($toUOM == 'kel'))) {
2486:                         return $value;
2487:             } elseif ((($fromUOM == 'C') || ($fromUOM == 'cel')) &&
2488:                       (($toUOM == 'C') || ($toUOM == 'cel'))) {
2489:                     return $value;
2490:             }
2491:             if (($toUOM == 'F') || ($toUOM == 'fah')) {
2492:                 if (($fromUOM == 'K') || ($fromUOM == 'kel')) {
2493:                     $value -= 273.15;
2494:                 }
2495:                 return ($value * 1.8) + 32;
2496:             }
2497:             if (($toUOM == 'C') || ($toUOM == 'cel')) {
2498:                 return $value - 273.15;
2499:             }
2500:             return $value + 273.15;
2501:         }
2502:         return ($value * self::$_unitConversions[$unitGroup1][$fromUOM][$toUOM]) / $toMultiplier;
2503:     }   //  function CONVERTUOM()
2504: 
2505: }   //  class PHPExcel_Calculation_Engineering
2506: 
Autene API documentation generated by ApiGen