+// NOTE: freebsd < 8-CURRENT doesn't appear to support *l, but we can
+// approximate.
+version( freebsd )
+{
+ double acos(double x);
+ float acosf(float x);
+ real acosl(real x) { return acos(x); }
+
+ double asin(double x);
+ float asinf(float x);
+ real asinl(real x) { return asin(x); }
+
+ double atan(double x);
+ float atanf(float x);
+ real atanl(real x) { return atan(x); }
+
+ double atan2(double y, double x);
+ float atan2f(float y, float x);
+ real atan2l(real y, real x) { return atan2(y, x); }
+
+ double cos(double x);
+ float cosf(float x);
+ real cosl(real x) { return cos(x); }
+
+ double sin(double x);
+ float sinf(float x);
+ real sinl(real x) { return sin(x); }
+
+ double tan(double x);
+ float tanf(float x);
+ real tanl(real x) { return tan(x); }
+
+ double acosh(double x);
+ float acoshf(float x);
+ real acoshl(real x) { return acosh(x); }
+
+ double asinh(double x);
+ float asinhf(float x);
+ real asinhl(real x) { return asinh(x); }
+
+ double atanh(double x);
+ float atanhf(float x);
+ real atanhl(real x) { return atanh(x); }
+
+ double cosh(double x);
+ float coshf(float x);
+ real coshl(real x) { return cosh(x); }
+
+ double sinh(double x);
+ float sinhf(float x);
+ real sinhl(real x) { return sinh(x); }
+
+ double tanh(double x);
+ float tanhf(float x);
+ real tanhl(real x) { return tanh(x); }
+
+ double exp(double x);
+ float expf(float x);
+ real expl(real x) { return exp(x); }
+
+ double exp2(double x);
+ float exp2f(float x);
+ real exp2l(real x) { return exp2(x); }
+
+ double expm1(double x);
+ float expm1f(float x);
+ real expm1l(real x) { return expm1(x); }
+
+ double frexp(double value, int* exp);
+ float frexpf(float value, int* exp);
+ real frexpl(real value, int* exp) { return frexp(value, exp); }
+
+ int ilogb(double x);
+ int ilogbf(float x);
+ int ilogbl(real x) { return ilogb(x); }
+
+ double ldexp(double x, int exp);
+ float ldexpf(float x, int exp);
+ real ldexpl(real x, int exp) { return ldexp(x, exp); }
+
+ double log(double x);
+ float logf(float x);
+ real logl(real x) { return log(x); }
+
+ double log10(double x);
+ float log10f(float x);
+ real log10l(real x) { return log10(x); }
+
+ double log1p(double x);
+ float log1pf(float x);
+ real log1pl(real x) { return log1p(x); }
+
+ private const real ONE_LN2 = 1 / 0x1.62e42fefa39ef358p-1L;
+ double log2(double x) { return log(x) * ONE_LN2; }
+ float log2f(float x) { return logf(x) * ONE_LN2; }
+ real log2l(real x) { return logl(x) * ONE_LN2; }
+
+ double logb(double x);
+ float logbf(float x);
+ real logbl(real x) { return logb(x); }
+
+ double modf(double value, double* iptr);
+ float modff(float value, float* iptr);
+ //real modfl(real value, real *iptr); // nontrivial conversion
+
+ double scalbn(double x, int n);
+ float scalbnf(float x, int n);
+ real scalbnl(real x, int n) { return scalbn(x, n); }
+
+ double scalbln(double x, c_long n);
+ float scalblnf(float x, c_long n);
+ real scalblnl(real x, c_long n) { return scalbln(x, n); }
+
+
+ double cbrt(double x);
+ float cbrtf(float x);
+ real cbrtl(real x) { return cbrt(x); }
+
+ double fabs(double x);
+ float fabsf(float x);
+ real fabsl(real x) { return fabs(x); }
+
+ double hypot(double x, double y);
+ float hypotf(float x, float y);
+ real hypotl(real x, real y) { return hypot(x, y); }
+
+ double pow(double x, double y);
+ float powf(float x, float y);
+ real powl(real x, real y) { return pow(x, y); }
+
+ double sqrt(double x);
+ float sqrtf(float x);
+ real sqrtl(real x) { return sqrt(x); }
+
+ double erf(double x);
+ float erff(float x);
+ real erfl(real x) { return erf(x); }
+
+ double erfc(double x);
+ float erfcf(float x);
+ real erfcl(real x) { return erfc(x); }
+
+ double lgamma(double x);
+ float lgammaf(float x);
+ real lgammal(real x) { return lgamma(x); }
+
+ double tgamma(double x);
+ float tgammaf(float x);
+ real tgammal(real x) { return tgamma(x); }
+
+ double ceil(double x);
+ float ceilf(float x);
+ real ceill(real x) { return ceil(x); }
+
+ double floor(double x);
+ float floorf(float x);
+ real floorl(real x) { return floor(x); }
+
+ double nearbyint(double x);
+ float nearbyintf(float x);
+ real nearbyintl(real x) { return nearbyint(x); }
+
+ double rint(double x);
+ float rintf(float x);
+ real rintl(real x) { return rint(x); }
+
+ c_long lrint(double x);
+ c_long lrintf(float x);
+ c_long lrintl(real x) { return lrint(x); }
+
+ long llrint(double x);
+ long llrintf(float x);
+ long llrintl(real x) { return llrint(x); }
+
+ double round(double x);
+ float roundf(float x);
+ real roundl(real x) { return round(x); }
+
+ c_long lround(double x);
+ c_long lroundf(float x);
+ c_long lroundl(real x) { return lround(x); }
+
+ long llround(double x);
+ long llroundf(float x);
+ long llroundl(real x) { return llround(x); }
+
+ double trunc(double x);
+ float truncf(float x);
+ real truncl(real x) { return trunc(x); }
+
+ double fmod(double x, double y);
+ float fmodf(float x, float y);
+ real fmodl(real x, real y) { return fmod(x, y); }
+
+ double remainder(double x, double y);
+ float remainderf(float x, float y);
+ real remainderl(real x, real y) { return remainder(x, y); }
+
+ double remquo(double x, double y, int* quo);
+ float remquof(float x, float y, int* quo);
+ real remquol(real x, real y, int* quo) { return remquo(x, y, quo); }
+
+ double copysign(double x, double y);
+ float copysignf(float x, float y);
+ real copysignl(real x, real y) { return copysign(x, y); }
+
+// double nan(char* tagp);
+// float nanf(char* tagp);
+// real nanl(char* tagp);
+
+ double nextafter(double x, double y);
+ float nextafterf(float x, float y);
+ real nextafterl(real x, real y) { return nextafter(x, y); }
+
+ double nexttoward(double x, real y);
+ float nexttowardf(float x, real y);
+ real nexttowardl(real x, real y) { return nexttoward(x, y); }
+
+ double fdim(double x, double y);
+ float fdimf(float x, float y);
+ real fdiml(real x, real y) { return fdim(x, y); }
+
+ double fmax(double x, double y);
+ float fmaxf(float x, float y);
+ real fmaxl(real x, real y) { return fmax(x, y); }
+
+ double fmin(double x, double y);
+ float fminf(float x, float y);
+ real fminl(real x, real y) { return fmin(x, y); }
+
+ double fma(double x, double y, double z);
+ float fmaf(float x, float y, float z);
+ real fmal(real x, real y, real z) { return fma(x, y, z); }
+}
+else
+{
+ double acos(double x);
+ float acosf(float x);
+ real acosl(real x);