std::math (v0.2.1)

Mathematical constants and wrappers around scalar math functions for f64 and f32.

Latest

Overview

The std::math module gives Thrust names to common scalar math functions. It includes constants, trigonometry, logarithms, exponentials, rounding helpers, comparisons, and several special functions.

These functions are wrappers over the platform math library. You can write math::squareRoot or math::power in Thrust code without importing the raw C names everywhere.

For edge cases such as NaN, infinities, and domain errors, expect the same behavior as the C runtime on the target platform.

Source: thrustc/std/v0.2.1/math.thrust

Public Signatures

Exported declarations for this module snapshot.

const E: f64 @public @extern("E") = 2.7182818284590452354;
const LOG2E: f64 @public @extern("LOG2E") = 1.4426950408889634074;
const LOG10E: f64 @public @extern("LOG10E") = 0.43429448190325182765;
const LN2: f64 @public @extern("LN2") = 0.69314718055994530942;
const LN10: f64 @public @extern("LN10") = 2.30258509299404568402;
const PI: f64 @public @extern("PI") = 3.14159265358979323846;
const PI_2: f64 @public @extern("PI_2") = 1.57079632679489661923;
const PI_4: f64 @public @extern("PI_4") = 0.78539816339744830962;
const ONE_OVER_PI: f64 @public @extern("ONE_OVER_PI") = 0.31830988618379067154;
const TWO_OVER_PI: f64 @public @extern("TWO_OVER_PI") = 0.63661977236758134308;
const TWO_OVER_SQRT_PI: f64 @public @extern("TWO_OVER_SQRT_PI") = 1.12837916709551257390;
const SQRT2: f64 @public @extern("SQRT2") = 1.41421356237309504880;
const ONE_OVER_SQRT2: f64 @public @extern("ONE_OVER_SQRT2") = 0.70710678118654752440;
const TAU: f64 @public @extern("TAU") = 6.28318530717958647692;
const PI_3: f64 @public @extern("PI_3") = 1.04719755119659774615;
const PI_6: f64 @public @extern("PI_6") = 0.52359877559829887308;
const PI_8: f64 @public @extern("PI_8") = 0.39269908169872415481;
const RADIANS_PER_DEGREE: f64 @public @extern("RADIANS_PER_DEGREE") = 0.01745329251994329577;
const DEGREES_PER_RADIAN: f64 @public @extern("DEGREES_PER_RADIAN") = 57.295779513082320877;
const LOG2_10: f64 @public @extern("LOG2_10") = 3.32192809488736234787;
const LOG10_2: f64 @public @extern("LOG10_2") = 0.30102999566398119521;
const SQRT3: f64 @public @extern("SQRT3") = 1.73205080756887729353;
const ONE_OVER_SQRT3: f64 @public @extern("ONE_OVER_SQRT3") = 0.57735026918962576451;
const EULER_GAMMA: f64 @public @extern("EULER_GAMMA") = 0.57721566490153286061;
const GOLDEN_RATIO: f64 @public @extern("GOLDEN_RATIO") = 1.61803398874989484820;
const CATALAN: f64 @public @extern("CATALAN") = 0.91596559417721901505;
const APERY: f64 @public @extern("APERY") = 1.20205690315959428540;
fn sine(x: f64) f64 @public;
fn cosine(x: f64) f64 @public;
fn tangent(x: f64) f64 @public;
fn arcSine(x: f64) f64 @public;
fn arcCosine(x: f64) f64 @public;
fn arcTangent(x: f64) f64 @public;
fn arcTangent2(y: f64, x: f64) f64 @public;
fn hyperbolicSine(x: f64) f64 @public;
fn hyperbolicCosine(x: f64) f64 @public;
fn hyperbolicTangent(x: f64) f64 @public;
fn inverseHyperbolicSine(x: f64) f64 @public;
fn inverseHyperbolicCosine(x: f64) f64 @public;
fn inverseHyperbolicTangent(x: f64) f64 @public;
fn exponential(x: f64) f64 @public;
fn exponential2(x: f64) f64 @public;
fn exponentialMinusOne(x: f64) f64 @public;
fn naturalLogarithm(x: f64) f64 @public;
fn logarithm2(x: f64) f64 @public;
fn logarithm10(x: f64) f64 @public;
fn naturalLogarithmPlusOne(x: f64) f64 @public;
fn logarithmExponent(x: f64) f64 @public;
fn scaleByExponent(x: f64, exponent: s32) f64 @public;
fn fractionAndExponent(x: f64, exponent: ptr[s32]) f64 @public;
fn splitFraction(x: f64, integerPart: ptr[f64]) f64 @public;
fn power(x: f64, y: f64) f64 @public;
fn squareRoot(x: f64) f64 @public;
fn cubeRoot(x: f64) f64 @public;
fn hypotenuse(x: f64, y: f64) f64 @public;
fn powerInteger(x: f64, n: s64) f64 @public;
fn powerReal(x: f64, y: f64) f64 @public;
fn integerRoot(x: f64, n: s64) f64 @public;
fn reciprocalSquareRoot(x: f64) f64 @public;
fn compound(x: f64, n: s64) f64 @public;
fn ceiling(x: f64) f64 @public;
fn floorValue(x: f64) f64 @public;
fn roundValue(x: f64) f64 @public;
fn truncate(x: f64) f64 @public;
fn nearestInteger(x: f64) f64 @public;
fn nearbyInteger(x: f64) f64 @public;
fn modulo(x: f64, y: f64) f64 @public;
fn remainderValue(x: f64, y: f64) f64 @public;
fn remainderQuotient(x: f64, y: f64, quotient: ptr[s32]) f64 @public;
fn absolute(x: f64) f64 @public;
fn minimum(x: f64, y: f64) f64 @public;
fn maximum(x: f64, y: f64) f64 @public;
fn positiveDifference(x: f64, y: f64) f64 @public;
fn copySign(x: f64, y: f64) f64 @public;
fn fusedMultiplyAdd(x: f64, y: f64, z: f64) f64 @public;
fn notANumber(tag: CString) f64 @public;
fn nextRepresentable(x: f64, y: f64) f64 @public;
fn scaleByPowerOfTwo(x: f64, n: s32) f64 @public;
fn scaleByPowerOfTwoLong(x: f64, n: s64) f64 @public;
fn integerLogarithm(x: f64) s32 @public;
fn longLogarithm(x: f64) s64 @public;
fn nearestIntegerToLong(x: f64) s64 @public;
fn nearestIntegerToLongLong(x: f64) s64 @public;
fn roundToLong(x: f64) s64 @public;
fn roundToLongLong(x: f64) s64 @public;
fn errorFunction(x: f64) f64 @public;
fn complementaryErrorFunction(x: f64) f64 @public;
fn gammaFunction(x: f64) f64 @public;
fn logGamma(x: f64) f64 @public;
fn logGammaSigned(x: f64, sign: ptr[s32]) f64 @public;
fn besselJ0(x: f64) f64 @public;
fn besselJ1(x: f64) f64 @public;
fn besselJn(n: s32, x: f64) f64 @public;
fn besselY0(x: f64) f64 @public;
fn besselY1(x: f64) f64 @public;
fn besselYn(n: s32, x: f64) f64 @public;
fn sinePi(x: f64) f64 @public;
fn cosinePi(x: f64) f64 @public;
fn tangentPi(x: f64) f64 @public;
fn arcSinePi(x: f64) f64 @public;
fn arcCosinePi(x: f64) f64 @public;
fn arcTangentPi(x: f64) f64 @public;
fn arcTangent2Pi(y: f64, x: f64) f64 @public;
fn exponential10(x: f64) f64 @public;
fn exponential10MinusOne(x: f64) f64 @public;
fn exponential2MinusOne(x: f64) f64 @public;
fn logarithmPlusOne(x: f64) f64 @public;
fn logarithm2PlusOne(x: f64) f64 @public;
fn logarithm10PlusOne(x: f64) f64 @public;
fn nextUp(x: f64) f64 @public;
fn nextDown(x: f64) f64 @public;
fn getPayload(x: ptr[f64]) f64 @public;
fn fromFixedPoint(x: f64, round: s32, width: u32) f64 @public;
fn fromFixedPointExcept(x: f64, round: s32, width: u32) f64 @public;
fn unsignedFromFixedPoint(x: f64, round: s32, width: u32) u32 @public;
fn unsignedFromFixedPointExcept(x: f64, round: s32, width: u32) u32 @public;
fn legacyRemainder(x: f64, y: f64) f64 @public;
fn legacyGamma(x: f64) f64 @public;
fn scaleByBase(x: f64, n: f64) f64 @public;
fn mantissa(x: f64) f64 @public;
fn sine32(x: f32) f32 @public;
fn cosine32(x: f32) f32 @public;
fn tangent32(x: f32) f32 @public;
fn arcSine32(x: f32) f32 @public;
fn arcCosine32(x: f32) f32 @public;
fn arcTangent32(x: f32) f32 @public;
fn arcTangent2F32(y: f32, x: f32) f32 @public;
fn hyperbolicSine32(x: f32) f32 @public;
fn hyperbolicCosine32(x: f32) f32 @public;
fn hyperbolicTangent32(x: f32) f32 @public;
fn inverseHyperbolicSine32(x: f32) f32 @public;
fn inverseHyperbolicCosine32(x: f32) f32 @public;
fn inverseHyperbolicTangent32(x: f32) f32 @public;
fn exponential32(x: f32) f32 @public;
fn exponential2F32(x: f32) f32 @public;
fn exponentialMinusOne32(x: f32) f32 @public;
fn naturalLogarithm32(x: f32) f32 @public;
fn logarithm2F32(x: f32) f32 @public;
fn logarithm10F32(x: f32) f32 @public;
fn naturalLogarithmPlusOne32(x: f32) f32 @public;
fn logarithmExponent32(x: f32) f32 @public;
fn scaleByExponent32(x: f32, exponent: s32) f32 @public;
fn fractionAndExponent32(x: f32, exponent: ptr[s32]) f32 @public;
fn splitFraction32(x: f32, integerPart: ptr[f32]) f32 @public;
fn power32(x: f32, y: f32) f32 @public;
fn squareRoot32(x: f32) f32 @public;
fn cubeRoot32(x: f32) f32 @public;
fn hypotenuse32(x: f32, y: f32) f32 @public;
fn ceiling32(x: f32) f32 @public;
fn floorValue32(x: f32) f32 @public;
fn roundValue32(x: f32) f32 @public;
fn truncate32(x: f32) f32 @public;
fn nearestInteger32(x: f32) f32 @public;
fn nearbyInteger32(x: f32) f32 @public;
fn modulo32(x: f32, y: f32) f32 @public;
fn remainderValue32(x: f32, y: f32) f32 @public;
fn remainderQuotient32(x: f32, y: f32, quotient: ptr[s32]) f32 @public;
fn absolute32(x: f32) f32 @public;
fn minimum32(x: f32, y: f32) f32 @public;
fn maximum32(x: f32, y: f32) f32 @public;
fn positiveDifference32(x: f32, y: f32) f32 @public;
fn copySign32(x: f32, y: f32) f32 @public;
fn fusedMultiplyAdd32(x: f32, y: f32, z: f32) f32 @public;
fn notANumber32(tag: CString) f32 @public;
fn errorFunction32(x: f32) f32 @public;
fn complementaryErrorFunction32(x: f32) f32 @public;
fn gammaFunction32(x: f32) f32 @public;
fn logGamma32(x: f32) f32 @public;

Behavior and Use

Use the exported constants, such as PI and TAU, instead of repeating numeric literals in formulas.

If a calculation calls expensive functions many times, store intermediate results yourself. The module does not hide that cost.

Examples

import std::math;

fn main() s32 @public {
    var angle: f64 = math::PI_4;
    var s: f64 = math::sine(angle);
    var c: f64 = math::cosine(angle);

    if s > 0.70 && c > 0.70 {
        return 0;
    }

    return 1;
}
import std::math;

fn main() s32 @public {
    var hyp: f64 = math::hypotenuse(3.0, 4.0);
    var root: f64 = math::squareRoot(144.0);

    if hyp == 5.0 && root == 12.0 {
        return 0;
    }

    return 1;
}

Notes

Back to std index