Gamma logarithm implementation. \param arg function argument \return function value stored in single-preicision
| 1579 | /// \param arg function argument |
| 1580 | /// \return function value stored in single-preicision |
| 1581 | static expr lgamma(float arg) |
| 1582 | { |
| 1583 | #if HALF_ENABLE_CPP11_CMATH |
| 1584 | return expr(std::lgamma(arg)); |
| 1585 | #else |
| 1586 | if(builtin_isinf(arg)) |
| 1587 | return expr(std::numeric_limits<float>::infinity()); |
| 1588 | if(arg < 0.0f) |
| 1589 | { |
| 1590 | float i, f = std::modf(-arg, &i); |
| 1591 | if(f == 0.0f) |
| 1592 | return expr(std::numeric_limits<float>::infinity()); |
| 1593 | return expr(static_cast<float>(1.1447298858494001741434273513531- |
| 1594 | std::log(std::abs(std::sin(3.1415926535897932384626433832795*f)))-lgamma(1.0-arg))); |
| 1595 | } |
| 1596 | return expr(static_cast<float>(lgamma(static_cast<double>(arg)))); |
| 1597 | #endif |
| 1598 | } |
| 1599 | |
| 1600 | /// Gamma implementation. |
| 1601 | /// \param arg function argument |