blob: 36eb8ee02a6bb0b282f82c6c84e9858ed0d079b3 [file] [log] [blame]
/*
* Copyright (c) 2013 The Native Client Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
* This test ensures that PNaCl can deal with ``long double``, and that
* the C++11 standard library functions work.
*/
#include <cassert>
#include <cmath>
#include <stdio.h>
volatile long double ld = 3.14159265359;
long double ld2;
volatile double d = 3.14159265359;
volatile float f = 3.14159265359;
volatile long l = 42;
volatile int i = 42;
int i2;
int main() {
// PNaCl represents ``long double`` as a 64-bit value.
assert(sizeof(long double) == sizeof(double));
printf("%Lf\n", ld);
// All of the <cmath> functions that involve ``long double``.
printf("%Lf\n", std::acos(ld));
printf("%Lf\n", std::asin(ld));
printf("%Lf\n", std::atan(ld));
printf("%Lf\n", std::atan2(ld, ld));
printf("%Lf\n", std::ceil(ld));
printf("%Lf\n", std::cos(ld));
printf("%Lf\n", std::cosh(ld));
printf("%Lf\n", std::exp(ld));
printf("%Lf\n", std::fabs(ld));
printf("%Lf\n", std::floor(ld));
printf("%Lf\n", std::fmod(ld, ld));
printf("%Lf\n", std::frexp(ld, &i2));
printf("%Lf\n", std::ldexp(ld, i));
printf("%Lf\n", std::log(ld));
printf("%Lf\n", std::log10(ld));
printf("%Lf\n", std::modf(ld, &ld2));
printf("%Lf\n", std::pow(ld, ld));
printf("%Lf\n", std::sin(ld));
printf("%Lf\n", std::sinh(ld));
printf("%Lf\n", std::sqrt(ld));
printf("%Lf\n", std::tan(ld));
printf("%Lf\n", std::tanh(ld));
printf("%Lf\n", std::acosh(ld));
printf("%Lf\n", std::asinh(ld));
printf("%Lf\n", std::atanh(ld));
printf("%Lf\n", std::cbrt(ld));
printf("%Lf\n", std::copysign(ld, ld));
printf("%Lf\n", std::erf(ld));
printf("%Lf\n", std::erfc(ld));
printf("%Lf\n", std::exp2(ld));
printf("%Lf\n", std::expm1(ld));
printf("%Lf\n", std::fdim(ld, ld));
/*
* TODO(jfb) FMA is currently disallowed by PNaCl's ABI.
* printf("%Lf\n", std::fma(ld, ld, ld));
*/
printf("%Lf\n", std::fmax(ld, ld));
printf("%Lf\n", std::fmin(ld, ld));
printf("%Lf\n", std::hypot(ld, ld));
printf("%i\n", std::ilogb(ld));
printf("%Lf\n", std::lgamma(ld));
printf("%lli\n", std::llrint(ld));
printf("%lli\n", std::llround(ld));
printf("%Lf\n", std::log1p(ld));
printf("%Lf\n", std::log2(ld));
printf("%Lf\n", std::log2(ld));
printf("%Lf\n", std::logb(ld));
printf("%Lf\n", std::logb(ld));
printf("%li\n", std::lrint(ld));
printf("%li\n", std::lround(ld));
printf("%Lf\n", std::nearbyint(ld));
printf("%Lf\n", std::nextafter(ld, ld));
/*
* TODO(jfb) Currently unsupported by LLVM.
* printf("%f\n", std::nexttoward(f, ld));
* printf("%Lf\n", std::nexttoward(ld, ld));
* printf("%f\n", std::nexttoward<int>(i, ld));
*/
printf("%Lf\n", std::remainder(ld, ld));
printf("%Lf\n", std::remquo(ld, ld, &i2));
printf("%Lf\n", std::rint(ld));
printf("%Lf\n", std::round(ld));
printf("%Lf\n", std::scalbln(ld, l));
printf("%Lf\n", std::scalbn(ld, i));
printf("%Lf\n", std::tgamma(ld));
printf("%Lf\n", std::trunc(ld));
return 0;
}