← All changes
|
libraries/vendor/PhpSpreadsheet/Calculation/Statistical/Distributions/F.php
+15
-4
3.3.1
→
3.4
View file →
| @@ -54,10 +54,21 @@ | ||
| 54 | 54 | |
| 55 | 55 | return Beta::incompleteBeta($adjustedValue, $u / 2, $v / 2); |
| 56 | 56 | } |
| 57 | 57 | |
| 58 | - return (Gamma::gammaValue(($v + $u) / 2) | |
| 59 | - / (Gamma::gammaValue($u / 2) * Gamma::gammaValue($v / 2))) | |
| 60 | - * (($u / $v) ** ($u / 2)) | |
| 61 | - * (($value ** (($u - 2) / 2)) / ((1 + ($u / $v) * $value) ** (($u + $v) / 2))); | |
| 58 | + if ($value == 0.0) { | |
| 59 | + if ($u === 2) { | |
| 60 | + return 1.0; | |
| 61 | + } | |
| 62 | + | |
| 63 | + return ($u === 1) ? INF : 0.0; | |
| 64 | + } | |
| 65 | + | |
| 66 | + // Log domain, so large degrees of freedom cannot overflow the Gamma ratio. | |
| 67 | + return exp( | |
| 68 | + Gamma::logGamma(($v + $u) / 2) - Gamma::logGamma($u / 2) - Gamma::logGamma($v / 2) | |
| 69 | + + ($u / 2) * log($u / $v) | |
| 70 | + + (($u - 2) / 2) * log($value) | |
| 71 | + - (($u + $v) / 2) * log(1 + ($u / $v) * $value) | |
| 72 | + ); | |
| 62 | 73 | } |
| 63 | 74 | } |