|
@@ 939-965 (lines=27) @@
|
| 936 |
|
* @TODO Better handling of the approximation method to support the differences between Excel/Gnumeric and Open/Libre Office |
| 937 |
|
* |
| 938 |
|
*/ |
| 939 |
|
public static function BESSELK($x, $ord) { |
| 940 |
|
$x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); |
| 941 |
|
$ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); |
| 942 |
|
|
| 943 |
|
if ((is_numeric($x)) && (is_numeric($ord))) { |
| 944 |
|
if (($ord < 0) || ($x == 0.0)) { |
| 945 |
|
return PHPExcel_Calculation_Functions::NaN(); |
| 946 |
|
} |
| 947 |
|
|
| 948 |
|
switch(floor($ord)) { |
| 949 |
|
case 0 : return self::_Besselk0($x); |
| 950 |
|
break; |
| 951 |
|
case 1 : return self::_Besselk1($x); |
| 952 |
|
break; |
| 953 |
|
default : $fTox = 2 / $x; |
| 954 |
|
$fBkm = self::_Besselk0($x); |
| 955 |
|
$fBk = self::_Besselk1($x); |
| 956 |
|
for ($n = 1; $n < $ord; ++$n) { |
| 957 |
|
$fBkp = $fBkm + $n * $fTox * $fBk; |
| 958 |
|
$fBkm = $fBk; |
| 959 |
|
$fBk = $fBkp; |
| 960 |
|
} |
| 961 |
|
} |
| 962 |
|
return (is_nan($fBk)) ? PHPExcel_Calculation_Functions::NaN() : $fBk; |
| 963 |
|
} |
| 964 |
|
return PHPExcel_Calculation_Functions::VALUE(); |
| 965 |
|
} // function BESSELK() |
| 966 |
|
|
| 967 |
|
|
| 968 |
|
private static function _Bessely0($fNum) { |
|
@@ 1028-1054 (lines=27) @@
|
| 1025 |
|
* |
| 1026 |
|
* @return float |
| 1027 |
|
*/ |
| 1028 |
|
public static function BESSELY($x, $ord) { |
| 1029 |
|
$x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); |
| 1030 |
|
$ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); |
| 1031 |
|
|
| 1032 |
|
if ((is_numeric($x)) && (is_numeric($ord))) { |
| 1033 |
|
if (($ord < 0) || ($x == 0.0)) { |
| 1034 |
|
return PHPExcel_Calculation_Functions::NaN(); |
| 1035 |
|
} |
| 1036 |
|
|
| 1037 |
|
switch(floor($ord)) { |
| 1038 |
|
case 0 : return self::_Bessely0($x); |
| 1039 |
|
break; |
| 1040 |
|
case 1 : return self::_Bessely1($x); |
| 1041 |
|
break; |
| 1042 |
|
default: $fTox = 2 / $x; |
| 1043 |
|
$fBym = self::_Bessely0($x); |
| 1044 |
|
$fBy = self::_Bessely1($x); |
| 1045 |
|
for ($n = 1; $n < $ord; ++$n) { |
| 1046 |
|
$fByp = $n * $fTox * $fBy - $fBym; |
| 1047 |
|
$fBym = $fBy; |
| 1048 |
|
$fBy = $fByp; |
| 1049 |
|
} |
| 1050 |
|
} |
| 1051 |
|
return (is_nan($fBy)) ? PHPExcel_Calculation_Functions::NaN() : $fBy; |
| 1052 |
|
} |
| 1053 |
|
return PHPExcel_Calculation_Functions::VALUE(); |
| 1054 |
|
} // function BESSELY() |
| 1055 |
|
|
| 1056 |
|
|
| 1057 |
|
/** |