OSDN Git Service

* mingwex/math/round.c: Rewrite.
authordannysmith <dannysmith>
Mon, 29 Mar 2004 08:22:18 +0000 (08:22 +0000)
committerdannysmith <dannysmith>
Mon, 29 Mar 2004 08:22:18 +0000 (08:22 +0000)
* mingwex/math/roundf.c: Rewrite.
* mingwex/math/roundl.c: Rewrite.

winsup/mingw/ChangeLog
winsup/mingw/mingwex/math/round.c
winsup/mingw/mingwex/math/roundf.c
winsup/mingw/mingwex/math/roundl.c

index 65641bb..a4412a2 100644 (file)
@@ -1,3 +1,9 @@
+2004-03-29  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       * mingwex/math/round.c: Rewrite.
+       * mingwex/math/roundf.c: Rewrite.
+       * mingwex/math/roundl.c: Rewrite.
+
 2004-03-25  Danny Smith  <dannysmith@users.sourceforge.net>
 
        * include/_mingw.h (__MSVCRT_VERSION__): Define default as 0x0600.
index 9d8e949..d2d4cab 100644 (file)
@@ -1,29 +1,8 @@
-#include <fenv.h>
+#include <math.h>
 
 double
-round (double x) {
-  double retval;
-  unsigned short saved_cw, _cw;
-  __asm__ (
-       "fnstcw %0;"
-       : "=m" (saved_cw)
-       ); /* save  control word  */
-  _cw = ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
-         | (x > 0.0 ? FE_UPWARD : FE_DOWNWARD); /* round away from zero */
-  __asm__ (
-       "fldcw %0;"
-       :
-       : "m" (_cw)
-       );  /* load the rounding control */
-  __asm__ (
-       "frndint;"
-       : "=t" (retval)
-       : "0" (x)
-       ); /* do the rounding */
-  __asm__ (
-       "fldcw %0;"
-       :
-       : "m" (saved_cw)
-       ); /* restore control word */
-  return retval;
+round (double x)
+{
+  /* Add +/- 0.5 then then round towards zero.  */
+  return trunc ( x + (x >= 0.0 ?  0.5 : -0.5));
 }
index 6ae81bd..b50d950 100644 (file)
@@ -1,29 +1,8 @@
-#include <fenv.h>
+#include <math.h>
 
 float
-roundf (float x) {
-  double retval;
-  unsigned short saved_cw, _cw;
-  __asm__ (
-       "fnstcw %0;"
-       : "=m" (saved_cw)
-       ); /* save  control word  */
-  _cw = ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
-         | (x > 0.0 ? FE_UPWARD : FE_DOWNWARD); /* round away from zero */
-  __asm__ (
-       "fldcw %0;"
-       :
-       : "m" (_cw)
-       );  /* load the rounding control */
-  __asm__ (
-       "frndint;"
-       : "=t" (retval)
-       : "0" (x)
-       ); /* do the rounding */
-  __asm__ (
-       "fldcw %0;"
-       :
-       : "m" (saved_cw)
-       ); /* restore control word */
-  return retval;
+roundf (float x)
+{
+  /* Add +/- 0.5 then then round towards zero.  */
+  return truncf ( x + (x >= 0.0F ?  0.5F : -0.5F));
 }
index de3334a..9c5f0ac 100644 (file)
@@ -1,30 +1,8 @@
-#include <fenv.h>
+#include <math.h>
 
 long double
-roundl (long double x) {
-  long double retval;
-  unsigned short saved_cw, _cw;
-  __asm__ (
-       "fnstcw %0;"
-       : "=m" (saved_cw)
-       ); /* save  control word  */
-  _cw = ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
-         | (x > 0.0 ? FE_UPWARD : FE_DOWNWARD); /* round away from zero */
-  __asm__ (
-       "fldcw %0;"
-       :
-       : "m" (_cw)
-       );  /* load the rounding control */
-  __asm__ (
-       "frndint;"
-       : "=t" (retval)
-       : "0" (x)
-       ); /* do the rounding */
-  __asm__ (
-       "fldcw %0;"
-       :
-       : "m" (saved_cw)
-       ); /* restore control word */
-  return retval;
+roundl (long double x)
+{
+  /* Add +/- 0.5 then then round towards zero.  */
+  return truncl ( x + (x >= 0.0L ?  0.5L : -0.5L));
 }
-