浏览代码

I went nuts and wrote a generic rint implementation. I think it is
correct per the man page and a little testing seems to show it works.
-Erik

Eric Andersen 24 年之前
父节点
当前提交
4db5f2c0a1
共有 3 个文件被更改,包括 53 次插入2 次删除
  1. 0 1
      TODO
  2. 1 1
      libm/double/Makefile
  3. 52 0
      libm/double/rint.c

+ 0 - 1
TODO

@@ -13,7 +13,6 @@ run 'nm -D --size-sort -t d libuClibc-0.9.5.so' and work on the biggest things
     (i.e. stuff at the end of the list) to make them smaller.
     (i.e. stuff at the end of the list) to make them smaller.
 make inb/outb work (for lilo et all)
 make inb/outb work (for lilo et all)
 	update: done for i386.  lilo and the pcmcia tools compile cleanly now
 	update: done for i386.  lilo and the pcmcia tools compile cleanly now
-make rint work (for ip et all)
 include/resolv.h does not define struct _res, and libc/inet/resolv.c
 include/resolv.h does not define struct _res, and libc/inet/resolv.c
     does not use this struct.  res_init does nothing.  the other res_* 
     does not use this struct.  res_init does nothing.  the other res_* 
     functions are not implemented.
     functions are not implemented.

+ 1 - 1
libm/double/Makefile

@@ -35,7 +35,7 @@ CSRC=acosh.c airy.c asin.c asinh.c atan.c atanh.c bdtr.c beta.c \
 	polevl.c polmisc.c polylog.c polyn.c pow.c powi.c psi.c rgamma.c round.c \
 	polevl.c polmisc.c polylog.c polyn.c pow.c powi.c psi.c rgamma.c round.c \
 	shichi.c sici.c sin.c sindg.c sinh.c spence.c stdtr.c struve.c \
 	shichi.c sici.c sin.c sindg.c sinh.c spence.c stdtr.c struve.c \
 	tan.c tandg.c tanh.c unity.c yn.c zeta.c zetac.c \
 	tan.c tandg.c tanh.c unity.c yn.c zeta.c zetac.c \
-	sqrt.c floor.c setprec.c mtherr.c noncephes.c
+	sqrt.c floor.c setprec.c mtherr.c noncephes.c rint.c
 
 
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 

+ 52 - 0
libm/double/rint.c

@@ -0,0 +1,52 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * rint for uClibc
+ *
+ * Copyright (C) 2001 by Lineo, inc.  
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Library General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <math.h>
+
+/* From the Linux man page:
+ *
+ * NAME
+ *	rint - round to closest integer
+ *
+ * SYNOPSIS
+ *	#include <math.h>
+ *	double rint(double x);
+ *
+ * DESCRIPTION
+ *	The rint() function rounds x to an integer value according
+ *	to the prevalent rounding mode.  The default rounding mode
+ *	is to round to the nearest integer.  
+ *
+ * RETURN VALUE
+ *	The rint() function returns the integer value as a float­ 
+ *	ing-point number.
+ */
+
+double rint (double x) {
+	double low = floor(x);
+	if (fmod(x,low) >= (double)0.5)
+		return(ceil(x));
+	else
+		return(low);
+}
+