bitwiseworks / gcc-os2

Port of GCC compiler to OS/2
GNU General Public License v2.0
16 stars 2 forks source link

round() lround() #15

Closed SilvanScherrer closed 4 years ago

SilvanScherrer commented 4 years ago

round() and lround() are not members of std namespace. I faced some ports which want them in the std namespace. So I guess (nope I didn't a research) it's wrong.

dmik commented 4 years ago

Note that there is an old ticket, which I'm closing in favor of this one: https://github.com/psmedley/gcc/issues/34. It, however, contains useful information which should be carefully inspected while doing this task.

dmik commented 4 years ago

_GLIBCXX_USE_C99_MATH_TR1 is not defined in c++config.h because the following configure test:

#include <math.h>
int
main ()
{
typedef double_t  my_double_t;
          typedef float_t   my_float_t;
          acosh(0.0);
          acoshf(0.0f);
          acoshl(0.0l);
          asinh(0.0);
          asinhf(0.0f);
          asinhl(0.0l);
          atanh(0.0);
          atanhf(0.0f);
          atanhl(0.0l);
          cbrt(0.0);
          cbrtf(0.0f);
          cbrtl(0.0l);
          copysign(0.0, 0.0);
          copysignf(0.0f, 0.0f);
          copysignl(0.0l, 0.0l);
          erf(0.0);
          erff(0.0f);
          erfl(0.0l);
          erfc(0.0);
          erfcf(0.0f);
          erfcl(0.0l);
          exp2(0.0);
          exp2f(0.0f);
          exp2l(0.0l);
          expm1(0.0);
          expm1f(0.0f);
          expm1l(0.0l);
          fdim(0.0, 0.0);
          fdimf(0.0f, 0.0f);
          fdiml(0.0l, 0.0l);
          fma(0.0, 0.0, 0.0);
          fmaf(0.0f, 0.0f, 0.0f);
          fmal(0.0l, 0.0l, 0.0l);
          fmax(0.0, 0.0);
          fmaxf(0.0f, 0.0f);
          fmaxl(0.0l, 0.0l);
          fmin(0.0, 0.0);
          fminf(0.0f, 0.0f);
          fminl(0.0l, 0.0l);
          hypot(0.0, 0.0);
          hypotf(0.0f, 0.0f);
          hypotl(0.0l, 0.0l);
          ilogb(0.0);
          ilogbf(0.0f);
          ilogbl(0.0l);
          lgamma(0.0);
          lgammaf(0.0f);
          lgammal(0.0l);
          #ifndef __APPLE__ /* see below */
          llrint(0.0);
          llrintf(0.0f);
          llrintl(0.0l);
          llround(0.0);
          llroundf(0.0f);
          llroundl(0.0l);
          #endif
          log1p(0.0);
          log1pf(0.0f);
          log1pl(0.0l);
          log2(0.0);
          log2f(0.0f);
          log2l(0.0l);
          logb(0.0);
          logbf(0.0f);
          logbl(0.0l);
          lrint(0.0);
          lrintf(0.0f);
          lrintl(0.0l);
          lround(0.0);
          lroundf(0.0f);
          lroundl(0.0l);
          nan(0);
          nanf(0);
          nanl(0);
          nearbyint(0.0);
          nearbyintf(0.0f);
          nearbyintl(0.0l);
          nextafter(0.0, 0.0);
          nextafterf(0.0f, 0.0f);
          nextafterl(0.0l, 0.0l);
          nexttoward(0.0, 0.0);
          nexttowardf(0.0f, 0.0f);
          nexttowardl(0.0l, 0.0l);
          remainder(0.0, 0.0);
          remainderf(0.0f, 0.0f);
          remainderl(0.0l, 0.0l);
          remquo(0.0, 0.0, 0);
          remquof(0.0f, 0.0f, 0);
          remquol(0.0l, 0.0l, 0);
          rint(0.0);
          rintf(0.0f);
          rintl(0.0l);
          round(0.0);
          roundf(0.0f);
          roundl(0.0l);
          scalbln(0.0, 0l);
          scalblnf(0.0f, 0l);
          scalblnl(0.0l, 0l);
          scalbn(0.0, 0);
          scalbnf(0.0f, 0);
          scalbnl(0.0l, 0);
          tgamma(0.0);
          tgammaf(0.0f);
          tgammal(0.0l);
          trunc(0.0);
          truncf(0.0f);
          truncl(0.0l);

  ;
  return 0;
}

fails as follows:

conftest.cpp: In function 'int main()':
conftest.cpp:66:5: error: 'log2' was not declared in this scope; did you mean 'logl'?
   66 |     log2(0.0);
      |     ^~~~
      |     logl
conftest.cpp:67:5: error: 'log2f' was not declared in this scope; did you mean 'logf'?
   67 |     log2f(0.0f);
      |     ^~~~~
      |     logf
conftest.cpp:109:5: error: 'tgammaf' was not declared in this scope; did you mean 'tgammal'?
  109 |     tgammaf(0.0f);
      |     ^~~~~~~
      |     tgammal
dmik commented 4 years ago

As with other C stuff, these functions are in the ISO standard since long, see e.g. https://pubs.opengroup.org/onlinepubs/009695399/functions/log2.html. On OS/2 they are still a GNU C extension.

I will take updates from FreeBSD, as usual: https://github.com/freebsd/freebsd/blob/master/lib/msun/src/math.h