HIP math API#
HIP-Clang provides device-callable math operations, supporting most functions available in NVIDIA CUDA.
This section documents:
- Maximum error bounds for supported HIP math functions 
- Currently unsupported functions 
Error bounds on this page are measured in units in the last place (ULPs), representing the absolute difference between a HIP math function result and its corresponding C++ standard library function (e.g., comparing HIP’s sinf with C++’s sinf).
The following C++ example shows a simplified method for computing ULP differences between HIP and standard C++ math functions by first finding where the maximum absolute error occurs.
#include <hip/hip_runtime.h>
#include <iostream>
#include <vector>
#include <cmath>
#include <limits>
#define HIP_CHECK(expression)              \
    {                                      \
        const hipError_t err = expression; \
        if (err != hipSuccess) {           \
            std::cerr << "HIP error: "     \
                      << hipGetErrorString(err) \
                      << " at " << __LINE__ << "\n"; \
            exit(EXIT_FAILURE);            \
        }                                  \
    }
// Simple ULP difference calculator
int64_t ulp_diff(float a, float b) {
    if (a == b) return 0;
    union { float f; int32_t i; } ua{a}, ub{b};
    // For negative values, convert to a positive-based representation
    if (ua.i < 0) ua.i = std::numeric_limits<int32_t>::max() - ua.i;
    if (ub.i < 0) ub.i = std::numeric_limits<int32_t>::max() - ub.i;
    return std::abs((int64_t)ua.i - (int64_t)ub.i);
}
// Test kernel
__global__ void test_sin(float* out, int n) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n) {
        float x = -M_PI + (2.0f * M_PI * i) / (n - 1);
        out[i] = sin(x);
    }
}
int main() {
    const int n = 1000000;
    const int blocksize = 256;
    std::vector<float> outputs(n);
    float* d_out;
    HIP_CHECK(hipMalloc(&d_out, n * sizeof(float)));
    dim3 threads(blocksize);
    dim3 blocks((n + blocksize - 1) / blocksize);  // Fixed grid calculation
    test_sin<<<blocks, threads>>>(d_out, n);
    HIP_CHECK(hipPeekAtLastError());
    HIP_CHECK(hipMemcpy(outputs.data(), d_out, n * sizeof(float), hipMemcpyDeviceToHost));
    // Step 1: Find the maximum absolute error
    double max_abs_error = 0.0;
    float max_error_output = 0.0;
    float max_error_expected = 0.0;
    for (int i = 0; i < n; i++) {
        float x = -M_PI + (2.0f * M_PI * i) / (n - 1);
        float expected = std::sin(x);
        double abs_error = std::abs(outputs[i] - expected);
        if (abs_error > max_abs_error) {
            max_abs_error = abs_error;
            max_error_output = outputs[i];
            max_error_expected = expected;
        }
    }
    // Step 2: Compute ULP difference based on the max absolute error pair
    int64_t max_ulp = ulp_diff(max_error_output, max_error_expected);
    // Output results
    std::cout << "Max Absolute Error: " << max_abs_error << std::endl;
    std::cout << "Max ULP Difference: " << max_ulp << std::endl;
    std::cout << "Max Error Values -> Got: " << max_error_output
              << ", Expected: " << max_error_expected << std::endl;
    HIP_CHECK(hipFree(d_out));
    return 0;
}
Standard mathematical functions#
The functions in this section prioritize numerical accuracy and correctness, making them well-suited for applications that require high precision and predictable results. Unless explicitly specified, all math functions listed below are available on the device side.
Arithmetic#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float abs(float x)Returns the absolute value of \(x\) | \(x \in [-20, 20]\) | 0 | 
| float fabsf(float x)Returns the absolute value of x | \(x \in [-20, 20]\) | 0 | 
| float fdimf(float x, float y)Returns the positive difference between \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float fmaf(float x, float y, float z)Returns \(x \cdot y + z\) as a single operation. | \(x \in [-100, 100]\) \(y \in [-10, 10]\) \(z \in [-10, 10]\) | 0 | 
| float fmaxf(float x, float y)Determine the maximum numeric value of \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float fminf(float x, float y)Determine the minimum numeric value of \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float fmodf(float x, float y)Returns the floating-point remainder of \(x / y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float modff(float x, float* iptr)Break down \(x\) into fractional and integral parts. | \(x \in [-10, 10]\) | 0 | 
| float remainderf(float x, float y)Returns single-precision floating-point remainder. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float remquof(float x, float y, int* quo)Returns single-precision floating-point remainder and part of quotient. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float fdividef(float x, float y)Divide two floating point values. | \(x \in [-100, 100]\) \(y \in [-100, 100]\) | 0 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double abs(double x)Returns the absolute value of \(x\) | \(x \in [-20, 20]\) | 0 | 
| double fabs(double x)Returns the absolute value of x | \(x \in [-20, 20]\) | 0 | 
| double fdim(double x, double y)Returns the positive difference between \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| double fma(double x, double y, double z)Returns \(x \cdot y + z\) as a single operation. | \(x \in [-100, 100]\) \(y \in [-10, 10]\) \(z \in [-10, 10]\) | 0 | 
| double fmax(double x, double y)Determine the maximum numeric value of \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| double fmin(double x, double y)Determine the minimum numeric value of \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| double fmod(double x, double y)Returns the floating-point remainder of \(x / y\). | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| double modf(double x, double* iptr)Break down \(x\) into fractional and integral parts. | \(x \in [-10, 10]\) | 0 | 
| double remainder(double x, double y)Returns double-precision floating-point remainder. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| double remquo(double x, double y, int* quo)Returns double-precision floating-point remainder and part of quotient. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
Classification#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| bool isfinite(float x)Determine whether \(x\) is finite. | \(x \in [-\text{FLT_MAX}, \text{FLT_MAX}]\) Special values: \(\pm\infty\), NaN | 0 | 
| bool isinf(float x)Determine whether \(x\) is infinite. | \(x \in [-\text{FLT_MAX}, \text{FLT_MAX}]\) Special values: \(\pm\infty\), NaN | 0 | 
| bool isnan(float x)Determine whether \(x\) is a  NAN. | \(x \in [-\text{FLT_MAX}, \text{FLT_MAX}]\) Special values: \(\pm\infty\), NaN | 0 | 
| bool signbit(float x)Return the sign bit of \(x\). | \(x \in [-\text{FLT_MAX}, \text{FLT_MAX}]\) Special values: \(\pm\infty\), \(\pm0\), NaN | 0 | 
| float nanf(const char* tagp)Returns “Not a Number” value. | Input strings:  "","1","2","quiet","signaling","ind" | 0 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| bool isfinite(double x)Determine whether \(x\) is finite. | \(x \in [-\text{DBL_MAX}, \text{DBL_MAX}]\) Special values: \(\pm\infty\), NaN | 0 | 
| bool isin(double x)Determine whether \(x\) is infinite. | \(x \in [-\text{DBL_MAX}, \text{DBL_MAX}]\) Special values: \(\pm\infty\), NaN | 0 | 
| bool isnan(double x)Determine whether \(x\) is a  NAN. | \(x \in [-\text{DBL_MAX}, \text{DBL_MAX}]\) Special values: \(\pm\infty\), NaN | 0 | 
| bool signbit(double x)Return the sign bit of \(x\). | \(x \in [-\text{DBL_MAX}, \text{DBL_MAX}]\) Special values: \(\pm\infty\), \(\pm0\), NaN | 0 | 
| double nan(const char* tagp)Returns “Not a Number” value. | Input strings:  "","1","2","quiet","signaling","ind" | 0 | 
Error and Gamma#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float erff(float x)Returns the error function of \(x\). | \(x \in [-4, 4]\) | 4 | 
| float erfcf(float x)Returns the complementary error function of \(x\). | \(x \in [-4, 4]\) | 2 | 
| float erfcxf(float x)Returns the scaled complementary error function of \(x\). | \(x \in [-2, 2]\) | 5 | 
| float lgammaf(float x)Returns the natural logarithm of the absolute value of the gamma function of \(x\). | \(x \in [0.5, 20]\) | 4 | 
| float tgammaf(float x)Returns the gamma function of \(x\). | \(x \in [0.5, 15]\) | 6 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double erf(double x)Returns the error function of \(x\). | \(x \in [-4, 4]\) | 4 | 
| double erfc(double x)Returns the complementary error function of \(x\). | \(x \in [-4, 4]\) | 2 | 
| double erfcx(double x)Returns the scaled complementary error function of \(x\). | \(x \in [-2, 2]\) | 5 | 
| double lgamma(double x)Returns the natural logarithm of the absolute value of the gamma function of \(x\). | \(x \in [0.5, 20]\) | 2 | 
| double tgamma(double x)Returns the gamma function of \(x\). | \(x \in [0.5, 15]\) | 6 | 
Exponential and Logarithmic#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float expf(float x)Returns \(e^x\). | \(x \in [-10, 10]\) | 1 | 
| float exp2f(float x)Returns \(2^x\). | \(x \in [-10, 10]\) | 1 | 
| float exp10f(float x)Returns \(10^x\). | \(x \in [-4, 4]\) | 1 | 
| float expm1f(float x)Returns \(ln(x - 1)\) | \(x \in [-10, 10]\) | 1 | 
| float log10f(float x)Returns the base 10 logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 2 | 
| float log1pf(float x)Returns the natural logarithm of \(x + 1\). | \(x \in [-0.9, 10]\) | 1 | 
| float log2f(float x)Returns the base 2 logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 1 | 
| float logf(float x)Returns the natural logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 2 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double exp(double x)Returns \(e^x\). | \(x \in [-10, 10]\) | 1 | 
| double exp2(double x)Returns \(2^x\). | \(x \in [-10, 10]\) | 1 | 
| double exp10(double x)Returns \(10^x\). | \(x \in [-4, 4]\) | 1 | 
| double expm1(double x)Returns \(ln(x - 1)\) | \(x \in [-10, 10]\) | 1 | 
| double log10(double x)Returns the base 10 logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 1 | 
| double log1p(double x)Returns the natural logarithm of \(x + 1\). | \(x \in [-0.9, 10]\) | 1 | 
| double log2(double x)Returns the base 2 logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 1 | 
| double log(double x)Returns the natural logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 1 | 
Floating Point Manipulation#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float copysignf(float x, float y)Create value with given magnitude, copying sign of second value. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float frexpf(float x, int* nptr)Extract mantissa and exponent of \(x\). | \(x \in [-10, 10]\) | 0 | 
| int ilogbf(float x)Returns the unbiased integer exponent of \(x\). | \(x \in [0.01, 100]\) | 0 | 
| float logbf(float x)Returns the floating point representation of the exponent of \(x\). | \(x \in [10^{-6}, 10^6]\) | 0 | 
| float ldexpf(float x, int exp)Returns the natural logarithm of the absolute value of the gamma function of \(x\). | \(x \in [-10, 10]\) \(\text{exp} \in [-4, 4]\) | 0 | 
| float nextafterf(float x, float y)Returns next representable single-precision floating-point value after argument. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| float scalblnf(float x, long int n)Scale \(x\) by \(2^n\). | \(x \in [-10, 10]\) \(n \in [-4, 4]\) | 0 | 
| float scalbnf(float x, int n)Scale \(x\) by \(2^n\). | \(x \in [-10, 10]\) \(n \in [-4, 4]\) | 0 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double copysign(double x, double y)Create value with given magnitude, copying sign of second value. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| double frexp(double x, int* nptr)Extract mantissa and exponent of \(x\). | \(x \in [-10, 10]\) | 0 | 
| int ilogb(double x)Returns the unbiased integer exponent of \(x\). | \(x \in [0.01, 100]\) | 0 | 
| double logb(double x)Returns the floating point representation of the exponent of \(x\). | \(x \in [10^{-6}, 10^6]\) | 0 | 
| double ldexp(double x, int exp)Returns the natural logarithm of the absolute value of the gamma function of \(x\). | \(x \in [-10, 10]\) \(\text{exp} \in [-4, 4]\) | 0 | 
| double nextafter(double x, double y)Returns next representable double-precision floating-point value after argument. | \(x \in [-10, 10]\) \(y \in [-3, 3]\) | 0 | 
| double scalbln(double x, long int n)Scale \(x\) by \(2^n\). | \(x \in [-10, 10]\) \(n \in [-4, 4]\) | 0 | 
| double scalbn(double x, int n)Scale \(x\) by \(2^n\). | \(x \in [-10, 10]\) \(n \in [-4, 4]\) | 0 | 
Hypotenuse and Norm#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float hypotf(float x, float y)Returns the square root of the sum of squares of \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [0, 10]\) | 1 | 
| float rhypotf(float x, float y)Returns one over the square root of the sum of squares of two arguments. | \(x \in [-100, 100]\) \(y \in [-10, 100]\) | 1 | 
| float norm3df(float x, float y, float z)Returns the square root of the sum of squares of \(x\), \(y\) and \(z\). | All inputs in \([-10, 10]\) | 1 | 
| float norm4df(float x, float y, float z, float w)Returns the square root of the sum of squares of \(x\), \(y\), \(z\) and \(w\). | All inputs in \([-10, 10]\) | 2 | 
| float rnorm3df(float x, float y, float z)Returns one over the square root of the sum of squares of three coordinates of the argument. | All inputs in \([-10, 10]\) | 1 | 
| float rnorm4df(float x, float y, float z, float w)Returns one over the square root of the sum of squares of four coordinates of the argument. | All inputs in \([-10, 10]\) | 2 | 
| float normf(int dim, const float *a)Returns the square root of the sum of squares of any number of coordinates. | \(\text{dim} \in [2,4]\) \(a[i] \in [-10, 10]\) | Error depends on the number of coordinates e.g.  dim = 2-> 1e.g.  dim = 3-> 1e.g.  dim = 4-> 1 | 
| float rnormf(int dim, const float *a)Returns the reciprocal of square root of the sum of squares of any number of coordinates. | \(\text{dim} \in [2,4]\) \(a[i] \in [-10, 10]\) | Error depends on the number of coordinates e.g.  dim = 2-> 1e.g.  dim = 3-> 1e.g.  dim = 4-> 1 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double hypot(double x, double y)Returns the square root of the sum of squares of \(x\) and \(y\). | \(x \in [-10, 10]\) \(y \in [0, 10]\) | 1 | 
| double rhypot(double x, double y)Returns one over the square root of the sum of squares of two arguments. | \(x \in [-100, 100]\) \(y \in [-10, 100]\) | 1 | 
| double norm3d(double x, double y, double z)Returns the square root of the sum of squares of \(x\), \(y\) and \(z\). | All inputs in \([-10, 10]\) | 1 | 
| double norm4d(double x, double y, double z, double w)Returns the square root of the sum of squares of \(x\), \(y\), \(z\) and \(w\). | All inputs in \([-10, 10]\) | 2 | 
| double rnorm3d(double x, double y, double z)Returns one over the square root of the sum of squares of three coordinates of the argument. | All inputs in \([-10, 10]\) | 1 | 
| double rnorm4d(double x, double y, double z, double w)Returns one over the square root of the sum of squares of four coordinates of the argument. | All inputs in \([-10, 10]\) | 1 | 
| double norm(int dim, const double *a)Returns the square root of the sum of squares of any number of coordinates. | \(\text{dim} \in [2,4]\) \(a[i] \in [-10, 10]\) | Error depends on the number of coordinates e.g.  dim = 2-> 1e.g.  dim = 3-> 1e.g.  dim = 4-> 1 | 
| double rnorm(int dim, const double *a)Returns the reciprocal of square root of the sum of squares of any number of coordinates. | \(\text{dim} \in [2,4]\) \(a[i] \in [-10, 10]\) | Error depends on the number of coordinates e.g.  dim = 2-> 1e.g.  dim = 3-> 1e.g.  dim = 4-> 1 | 
Power and Root#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float cbrtf(float x)Returns the cube root of \(x\). | \(x \in [-100, 100]\) | 2 | 
| float powf(float x, float y)Returns \(x^y\). | \(x \in [-4, 4]\) \(y \in [-2, 2]\) | 1 | 
| float powif(float base, int iexp)Returns the value of first argument to the power of second argument. | \(\text{base} \in [-10, 10]\) \(\text{iexp} \in [-4, 4]\) | 1 | 
| float sqrtf(float x)Returns the square root of \(x\). | \(x \in [0, 100]\) | 1 | 
| float rsqrtf(float x)Returns the reciprocal of the square root of \(x\). | \(x \in [0.01, 100]\) | 1 | 
| float rcbrtf(float x)Returns the reciprocal cube root function. | \(x \in [-100, 100]\) | 1 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double cbrt(double x)Returns the cube root of \(x\). | \(x \in [-100, 100]\) | 1 | 
| double pow(double x, double y)Returns \(x^y\). | \(x \in [-4, 4]\) \(y \in [-2, 2]\) | 1 | 
| double powi(double base, int iexp)Returns the value of first argument to the power of second argument. | \(\text{base} \in [-10, 10]\) \(\text{iexp} \in [-4, 4]\) | 1 | 
| double sqrt(double x)Returns the square root of \(x\). | \(x \in [0, 100]\) | 1 | 
| double rsqrt(double x)Returns the reciprocal of the square root of \(x\). | \(x \in [0.01, 100]\) | 1 | 
| double rcbrt(double x)Returns the reciprocal cube root function. | \(x \in [-100, 100]\) | 1 | 
Rounding#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float ceilf(float x)Returns ceiling of \(x\). | \(x \in [-4, 4]\) | 0 | 
| float floorf(float x)Returns the largest integer less than or equal to \(x\). | \(x \in [-4, 4]\) | 0 | 
| long int lroundf(float x)Round to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| long long int llroundf(float x)Round to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| long int lrintf(float x)Round \(x\) to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| long long int llrintf(float x)Round \(x\) to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| float nearbyintf(float x)Round \(x\) to the nearest integer. | \(x \in [-4, 4]\) | 0 | 
| float roundf(float x)Round to nearest integer value in floating-point. | \(x \in [-4, 4]\) | 0 | 
| float rintf(float x)Round input to nearest integer value in floating-point. | \(x \in [-4, 4]\) | 0 | 
| float truncf(float x)Truncate \(x\) to the integral part. | \(x \in [-4, 4]\) | 0 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double ceil(double x)Returns ceiling of \(x\). | \(x \in [-4, 4]\) | 0 | 
| double floor(double x)Returns the largest integer less than or equal to \(x\). | \(x \in [-4, 4]\) | 0 | 
| long int lround(double x)Round to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| long long int llround(double x)Round to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| long int lrint(double x)Round \(x\) to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| long long int llrint(double x)Round \(x\) to nearest integer value. | \(x \in [-4, 4]\) | 0 | 
| double nearbyint(double x)Round \(x\) to the nearest integer. | \(x \in [-4, 4]\) | 0 | 
| double round(double x)Round to nearest integer value in floating-point. | \(x \in [-4, 4]\) | 0 | 
| double rint(double x)Round input to nearest integer value in floating-point. | \(x \in [-4, 4]\) | 0 | 
| double trunc(double x)Truncate \(x\) to the integral part. | \(x \in [-4, 4]\) | 0 | 
Trigonometric and Hyperbolic#
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float acosf(float x)Returns the arc cosine of \(x\). | \(x \in [-1, 1]\) | 1 | 
| float acoshf(float x)Returns the nonnegative arc hyperbolic cosine of \(x\). | \(x \in [1, 100]\) | 1 | 
| float asinf(float x)Returns the arc sine of \(x\). | \(x \in [-1, 1]\) | 2 | 
| float asinhf(float x)Returns the arc hyperbolic sine of \(x\). | \(x \in [-10, 10]\) | 1 | 
| float atanf(float x)Returns the arc tangent of \(x\). | \(x \in [-10, 10]\) | 2 | 
| float atan2f(float x, float y)Returns the arc tangent of the ratio of \(x\) and \(y\). | \(x \in [-4, 4]\) \(y \in [-2, 2]\) | 1 | 
| float atanhf(float x)Returns the arc hyperbolic tangent of \(x\). | \(x \in [-0.9, 0.9]\) | 1 | 
| float cosf(float x)Returns the cosine of \(x\). | \(x \in [-\pi, \pi]\) | 1 | 
| float coshf(float x)Returns the hyperbolic cosine of \(x\). | \(x \in [-5, 5]\) | 1 | 
| float sinf(float x)Returns the sine of \(x\). | \(x \in [-\pi, \pi]\) | 1 | 
| float sinhf(float x)Returns the hyperbolic sine of \(x\). | \(x \in [-5, 5]\) | 1 | 
| void sincosf(float x, float *sptr, float *cptr)Returns the sine and cosine of \(x\). | \(x \in [-3, 3]\) | sin: 1cos: 1 | 
| float tanf(float x)Returns the tangent of \(x\). | \(x \in [-1.47\pi, 1.47\pi]\) | 1 | 
| float tanhf(float x)Returns the hyperbolic tangent of \(x\). | \(x \in [-5, 5]\) | 2 | 
| float cospif(float x)Returns the cosine of \(\pi \cdot x\). | \(x \in [-0.3, 0.3]\) | 1 | 
| float sinpif(float x)Returns the hyperbolic sine of \(\pi \cdot x\). | \(x \in [-0.625, 0.625]\) | 2 | 
| void sincospif(float x, float *sptr, float *cptr)Returns the sine and cosine of \(\pi \cdot x\). | \(x \in [-0.3, 0.3]\) | sinpi: 2cospi: 1 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double acos(double x)Returns the arc cosine of \(x\). | \(x \in [-1, 1]\) | 1 | 
| double acosh(double x)Returns the nonnegative arc hyperbolic cosine of \(x\). | \(x \in [1, 100]\) | 1 | 
| double asin(double x)Returns the arc sine of \(x\). | \(x \in [-1, 1]\) | 1 | 
| double asinh(double x)Returns the arc hyperbolic sine of \(x\). | \(x \in [-10, 10]\) | 1 | 
| double atan(double x)Returns the arc tangent of \(x\). | \(x \in [-10, 10]\) | 1 | 
| double atan2(double x, double y)Returns the arc tangent of the ratio of \(x\) and \(y\). | \(x \in [-4, 4]\) \(y \in [-2, 2]\) | 1 | 
| double atanh(double x)Returns the arc hyperbolic tangent of \(x\). | \(x \in [-0.9, 0.9]\) | 1 | 
| double cos(double x)Returns the cosine of \(x\). | \(x \in [-\pi, \pi]\) | 1 | 
| double cosh(double x)Returns the hyperbolic cosine of \(x\). | \(x \in [-5, 5]\) | 1 | 
| double sin(double x)Returns the sine of \(x\). | \(x \in [-\pi, \pi]\) | 1 | 
| double sinh(double x)Returns the hyperbolic sine of \(x\). | \(x \in [-5, 5]\) | 1 | 
| void sincos(double x, double *sptr, double *cptr)Returns the sine and cosine of \(x\). | \(x \in [-3, 3]\) | sin: 1cos: 1 | 
| double tan(double x)Returns the tangent of \(x\). | \(x \in [-1.47\pi, 1.47\pi]\) | 1 | 
| double tanh(double x)Returns the hyperbolic tangent of \(x\). | \(x \in [-5, 5]\) | 1 | 
| double cospi(double x)Returns the cosine of \(\pi \cdot x\). | \(x \in [-0.3, 0.3]\) | 2 | 
| double sinpi(double x)Returns the hyperbolic sine of \(\pi \cdot x\). | \(x \in [-0.625, 0.625]\) | 2 | 
| void sincospi(double x, double *sptr, double *cptr)Returns the sine and cosine of \(\pi \cdot x\). | \(x \in [-0.3, 0.3]\) | sinpi: 2cospi: 2 | 
No C++ STD Implementation#
This table lists HIP device functions that do not have a direct equivalent in the C++ standard library. These functions were excluded from comparison due to the complexity of implementing a precise reference version within the standard library’s constraints.
| Function | 
| float j0f(float x)Returns the value of the Bessel function of the first kind of order 0 for \(x\). | 
| float j1f(float x)Returns the value of the Bessel function of the first kind of order 1 for \(x\). | 
| float jnf(int n, float x)Returns the value of the Bessel function of the first kind of order n for \(x\). | 
| float y0f(float x)Returns the value of the Bessel function of the second kind of order 0 for \(x\). | 
| float y1f(float x)Returns the value of the Bessel function of the second kind of order 1 for \(x\). | 
| float ynf(int n, float x)Returns the value of the Bessel function of the second kind of order n for \(x\). | 
| float erfcinvf(float x)Returns the inverse complementary function of \(x\). | 
| float erfinvf(float x)Returns the inverse error function of \(x\). | 
| float normcdff(float y)Returns the standard normal cumulative distribution function. | 
| float normcdfinvf(float y)Returns the inverse of the standard normal cumulative distribution function. | 
| Function | 
| double j0(double x)Returns the value of the Bessel function of the first kind of order 0 for \(x\). | 
| double j1(double x)Returns the value of the Bessel function of the first kind of order 1 for \(x\). | 
| double jn(int n, double x)Returns the value of the Bessel function of the first kind of order n for \(x\). | 
| double y0(double x)Returns the value of the Bessel function of the second kind of order 0 for \(x\). | 
| double y1(double x)Returns the value of the Bessel function of the second kind of order 1 for \(x\). | 
| double yn(int n, double x)Returns the value of the Bessel function of the second kind of order n for \(x\). | 
| double erfcinv(double x)Returns the inverse complementary function of \(x\). | 
| double erfinv(double x)Returns the inverse error function of \(x\). | 
| double normcdf(double y)Returns the standard normal cumulative distribution function. | 
| double normcdfinv(double y)Returns the inverse of the standard normal cumulative distribution function. | 
Unsupported#
This table lists functions that are not supported by HIP.
| Function | 
| float cyl_bessel_i0f(float x)Returns the value of the regular modified cylindrical Bessel function of order 0 for \(x\). | 
| float cyl_bessel_i1f(float x)Returns the value of the regular modified cylindrical Bessel function of order 1 for \(x\). | 
| Function | 
| double cyl_bessel_i0(double x)Returns the value of the regular modified cylindrical Bessel function of order 0 for \(x\). | 
| double cyl_bessel_i1(double x)Returns the value of the regular modified cylindrical Bessel function of order 1 for \(x\). | 
Intrinsic mathematical functions#
Intrinsic math functions are optimized for performance on HIP-supported hardware. These functions often trade some precision for faster execution, making them ideal for applications where computational efficiency is a priority over strict numerical accuracy. Note that intrinsics are supported on device only.
Floating-point Intrinsics#
Note
Only the nearest-even rounding mode is supported by default on AMD GPUs. The _rz, _ru, and _rd
suffixed intrinsic functions exist in the HIP AMD backend if the
OCML_BASIC_ROUNDED_OPERATIONS macro is defined.
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| float __cosf(float x)Returns the fast approximate cosine of \(x\). | \(x \in [-\pi, \pi]\) | 4 | 
| float __exp10f(float x)Returns the fast approximate for 10 x. | \(x \in [-4, 4]\) | 18 | 
| float __expf(float x)Returns the fast approximate for e x. | \(x \in [-10, 10]\) | 6 | 
| float __fadd_rn(float x, float y)Add two floating-point values in round-to-nearest-even mode. | \(x \in [-1000, 1000]\) \(y \in [-1000, 1000]\) | 0 | 
| float __fdiv_rn(float x, float y)Divide two floating-point values in round-to-nearest-even mode. | \(x \in [-100, 100]\) \(y \in [-100, 100]\) | 0 | 
| float __fmaf_rn(float x, float y, float z)Returns  x × y + zas a single operation in round-to-nearest-even mode. | \(x \in [-100, 100]\) \(y \in [-10, 10]\) \(z \in [-10, 10]\) | 0 | 
| float __fmul_rn(float x, float y)Multiply two floating-point values in round-to-nearest-even mode. | \(x \in [-100, 100]\) \(y \in [-100, 100]\) | 0 | 
| float __frcp_rn(float x, float y)Returns  1 / xin round-to-nearest-even mode. | \(x \in [-100, 100]\) | 0 | 
| float __frsqrt_rn(float x)Returns  1 / √xin round-to-nearest-even mode. | \(x \in [0.01, 100]\) | 1 | 
| float __fsqrt_rn(float x)Returns  √xin round-to-nearest-even mode. | \(x \in [0, 100]\) | 1 | 
| float __fsub_rn(float x, float y)Subtract two floating-point values in round-to-nearest-even mode. | \(x \in [-1000, 1000]\) \(y \in [-1000, 1000]\) | 0 | 
| float __log10f(float x)Returns the fast approximate for base 10 logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 2 | 
| float __log2f(float x)Returns the fast approximate for base 2 logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 1 | 
| float __logf(float x)Returns the fast approximate for natural logarithm of \(x\). | \(x \in [10^{-6}, 10^6]\) | 2 | 
| float __powf(float x, float y)Returns the fast approximate of x y. | \(x \in [-4, 4]\) \(y \in [-2, 2]\) | 1 | 
| float __saturatef(float x)Clamp \(x\) to [+0.0, 1.0]. | \(x \in [-2, 3]\) | 0 | 
| float __sincosf(float x, float* sinptr, float* cosptr)Returns the fast approximate of sine and cosine of \(x\). | \(x \in [-3, 3]\) | sin: 18cos: 4 | 
| float __sinf(float x)Returns the fast approximate sine of \(x\). | \(x \in [-\pi, \pi]\) | 18 | 
| float __tanf(float x)Returns the fast approximate tangent of \(x\). | \(x \in [-1.47\pi, 1.47\pi]\) | 1 | 
| Function | Test Range | ULP Difference of Maximum Absolute Error | 
| double __dadd_rn(double x, double y)Add two floating-point values in round-to-nearest-even mode. | \(x \in [-1000, 1000]\) \(y \in [-1000, 1000]\) | 0 | 
| double __ddiv_rn(double x, double y)Divide two floating-point values in round-to-nearest-even mode. | \(x \in [-100, 100]\) \(y \in [-100, 100]\) | 0 | 
| double __dmul_rn(double x, double y)Multiply two floating-point values in round-to-nearest-even mode. | \(x \in [-100, 100]\) \(y \in [-100, 100]\) | 0 | 
| double __drcp_rn(double x, double y)Returns  1 / xin round-to-nearest-even mode. | \(x \in [-100, 100]\) | 0 | 
| double __dsqrt_rn(double x)Returns  √xin round-to-nearest-even mode. | \(x \in [0, 100]\) | 0 | 
| double __dsub_rn(double x, double y)Subtract two floating-point values in round-to-nearest-even mode. | \(x \in [-1000, 1000]\) \(y \in [-1000, 1000]\) | 0 | 
| double __fma_rn(double x, double y, double z)Returns  x × y + zas a single operation in round-to-nearest-even mode. | \(x \in [-100, 100]\) \(y \in [-10, 10]\) \(z \in [-10, 10]\) | 0 | 
Integer intrinsics#
This section covers HIP integer intrinsic functions. ULP error values are omitted since they only apply to floating-point operations, not integer arithmetic.
| Function | 
| unsigned int __brev(unsigned int x)Reverse the bit order of a 32 bit unsigned integer. | 
| unsigned long long int __brevll(unsigned long long int x)Reverse the bit order of a 64 bit unsigned integer. | 
| unsigned int __byte_perm(unsigned int x, unsigned int y, unsigned int z)Return selected bytes from two 32-bit unsigned integers. | 
| unsigned int __clz(int x)Return the number of consecutive high-order zero bits in 32 bit integer. | 
| unsigned int __clzll(long long int x)Return the number of consecutive high-order zero bits in 64 bit integer. | 
| unsigned int __ffs(int x)[1]Returns the position of the first set bit in a 32 bit integer. Note: if  xis0, will return0 | 
| unsigned int __ffsll(long long int x)[1]Returns the position of the first set bit in a 64 bit signed integer. Note: if  xis0, will return0 | 
| unsigned int __fns32(unsigned int mask, unsigned int base, int offset)Find the position of the n-th set to 1 bit in a 32-bit integer. Note: this intrinsic is emulated via software, so performance can be potentially slower | 
| unsigned int __fns64(unsigned long long int mask, unsigned int base, int offset)Find the position of the n-th set to 1 bit in a 64-bit integer. Note: this intrinsic is emulated via software, so performance can be potentially slower | 
| unsigned int __funnelshift_l(unsigned int lo, unsigned int hi, unsigned int shift)Concatenate \(hi\) and \(lo\), shift left by shift & 31 bits, return the most significant 32 bits. | 
| unsigned int __funnelshift_lc(unsigned int lo, unsigned int hi, unsigned int shift)Concatenate \(hi\) and \(lo\), shift left by min(shift, 32) bits, return the most significant 32 bits. | 
| unsigned int __funnelshift_r(unsigned int lo, unsigned int hi, unsigned int shift)Concatenate \(hi\) and \(lo\), shift right by shift & 31 bits, return the least significant 32 bits. | 
| unsigned int __funnelshift_rc(unsigned int lo, unsigned int hi, unsigned int shift)Concatenate \(hi\) and \(lo\), shift right by min(shift, 32) bits, return the least significant 32 bits. | 
| unsigned int __hadd(int x, int y)Compute average of signed input arguments, avoiding overflow in the intermediate sum. | 
| unsigned int __rhadd(int x, int y)Compute rounded average of signed input arguments, avoiding overflow in the intermediate sum. | 
| unsigned int __uhadd(int x, int y)Compute average of unsigned input arguments, avoiding overflow in the intermediate sum. | 
| unsigned int __urhadd (unsigned int x, unsigned int y)Compute rounded average of unsigned input arguments, avoiding overflow in the intermediate sum. | 
| int __sad(int x, int y, int z)Returns \(|x - y| + z\), the sum of absolute difference. | 
| unsigned int __usad(unsigned int x, unsigned int y, unsigned int z)Returns \(|x - y| + z\), the sum of absolute difference. | 
| unsigned int __popc(unsigned int x)Count the number of bits that are set to 1 in a 32 bit integer. | 
| unsigned int __popcll(unsigned long long int x)Count the number of bits that are set to 1 in a 64 bit integer. | 
| int __mul24(int x, int y)Multiply two 24bit integers. | 
| unsigned int __umul24(unsigned int x, unsigned int y)Multiply two 24bit unsigned integers. | 
| int __mulhi(int x, int y)Returns the most significant 32 bits of the product of the two 32-bit integers. | 
| unsigned int __umulhi(unsigned int x, unsigned int y)Returns the most significant 32 bits of the product of the two 32-bit unsigned integers. | 
| long long int __mul64hi(long long int x, long long int y)Returns the most significant 64 bits of the product of the two 64-bit integers. | 
| unsigned long long int __umul64hi(unsigned long long int x, unsigned long long int y)Returns the most significant 64 bits of the product of the two 64 unsigned bit integers. |