| 651 | // attributed to Kahan. See: http://www.plunk.org/~hatch/rightway.php. |
| 652 | template<typename Scalar> |
| 653 | EIGEN_DEVICE_FUNC inline Scalar expm1(const Scalar& x) { |
| 654 | EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) |
| 655 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 656 | |
| 657 | EIGEN_USING_STD(exp); |
| 658 | Scalar u = exp(x); |
| 659 | if (numext::equal_strict(u, Scalar(1))) { |
| 660 | return x; |
| 661 | } |
| 662 | Scalar um1 = u - RealScalar(1); |
| 663 | if (numext::equal_strict(um1, Scalar(-1))) { |
| 664 | return RealScalar(-1); |
| 665 | } |
| 666 | |
| 667 | EIGEN_USING_STD(log); |
| 668 | Scalar logu = log(u); |
| 669 | return numext::equal_strict(u, logu) ? u : (u - RealScalar(1)) * x / logu; |
| 670 | } |
| 671 | } |
| 672 | |
| 673 | template<typename Scalar> |