Skip to content

Commit

Permalink
[BZ #2592]
Browse files Browse the repository at this point in the history
2006-06-17  Joseph S. Myers  <joseph@codesourcery.com>
	[BZ #2592]
	* math/libm-test.inc (lrint_test_tonearest): New function.
	(lrint_test_towardzero): New function.
	(lrint_test_downward): New function.
	(lrint_test_upward): New function.
	(main): Run these new tests.
	* sysdeps/ieee754/dbl-64/s_llrint.c (__llrint): Correct rounding
	of values near to 0.
	(two52): Use double not long double.
	* sysdeps/ieee754/dbl-64/s_lrint.c (__lrint): Likewise.
	* sysdeps/ieee754/flt-32/s_llrintf.c (__llrintf): Likewise.
	(two23): Use float not double.
	* sysdeps/ieee754/flt-32/s_lrintf.c (__lrintf): Likewise.
	(two23): Use float not double.
	* sysdeps/ieee754/ldbl-128/s_llrintl.c (__llrintl): Likewise.
	* sysdeps/ieee754/ldbl-128/s_lrintl.c (__lrintl): Likewise.
	* sysdeps/ieee754/ldbl-96/s_llrintl.c (__llrintl): Likewise.
	* sysdeps/ieee754/ldbl-96/s_lrintl.c (__lrintl): Likewise.
  • Loading branch information
Ulrich Drepper committed Sep 20, 2006
1 parent 60cb50c commit 6624dbc
Show file tree
Hide file tree
Showing 12 changed files with 248 additions and 77 deletions.
21 changes: 21 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
2006-06-17 Joseph S. Myers <joseph@codesourcery.com>

[BZ #2592]
* math/libm-test.inc (lrint_test_tonearest): New function.
(lrint_test_towardzero): New function.
(lrint_test_downward): New function.
(lrint_test_upward): New function.
(main): Run these new tests.
* sysdeps/ieee754/dbl-64/s_llrint.c (__llrint): Correct rounding
of values near to 0.
(two52): Use double not long double.
* sysdeps/ieee754/dbl-64/s_lrint.c (__lrint): Likewise.
* sysdeps/ieee754/flt-32/s_llrintf.c (__llrintf): Likewise.
(two23): Use float not double.
* sysdeps/ieee754/flt-32/s_lrintf.c (__lrintf): Likewise.
(two23): Use float not double.
* sysdeps/ieee754/ldbl-128/s_llrintl.c (__llrintl): Likewise.
* sysdeps/ieee754/ldbl-128/s_lrintl.c (__lrintl): Likewise.
* sysdeps/ieee754/ldbl-96/s_llrintl.c (__llrintl): Likewise.
* sysdeps/ieee754/ldbl-96/s_lrintl.c (__lrintl): Likewise.

2006-09-20 Martin Schwidefsky <schwidefsky@de.ibm.com>

* sysdeps/unix/sysv/linux/s390/s390-32/makecontext.c (__makecontext):
Expand Down
7 changes: 7 additions & 0 deletions localedata/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2006-09-20 Ulrich Drepper <drepper@redhat.com>

[BZ #2823]
* locales/mk_MK: Fix date_fmt. Add week, first_weekday, and
first_workday information.
Patch by Damjan Georgievski.

2006-09-05 Ulrich Drepper <drepper@redhat.com>

* locales/or_IN (mon): Fix February string.
Expand Down
15 changes: 9 additions & 6 deletions localedata/locales/mk_MK
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
comment_char %
escape_char /
% Macedonian language locale for Macedonia
% Damjan Georgievski <gdamjan@freemail.org.mk>
% Revision: 1.8 (2000-11-07)
% Damjan Georgievski { gdamjan %% gmail.com }
% Revision: 2.2 (2006-09-12)
% Charsets: UTF-8, ISO-8859-5, CP1251
% Distribution and use is free, also
% for commercial purposes.
Expand All @@ -12,13 +12,13 @@ title "Macedonian locale for Macedonia"
source ""
address ""
contact "Damjan Georgievski"
email "gdamjan@freemail.org.mk"
email "bug-glibc-locales@gnu.org"
tel ""
fax ""
language "Macedonian"
territory "Macedonia"
revision "1.8"
date "2000-11-07"
revision "2.2"
date "2006-09-12"
%
category "mk_MK:2000";LC_IDENTIFICATION
category "mk_MK:2000";LC_CTYPE
Expand Down Expand Up @@ -82,9 +82,12 @@ d_fmt "<U0025><U0064><U002E><U0025><U006D><U002E><U0025><U0059>"
t_fmt "<U0025><U0054>"
am_pm "";""
t_fmt_ampm ""
date_fmt "<U0025><U0061><U0020><U0025><U0062><U0020><U0025><U0065>/
date_fmt "<U0025><U0061><U002C><U0020><U0025><U0064><U0020><U0025><U0062>/
<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/
<U0025><U005A><U0020><U0025><U0059>"
week 7;19971201;4
first_weekday 1 % Monday
first_workday 1 % Monday
END LC_TIME

LC_MONETARY
Expand Down
164 changes: 164 additions & 0 deletions math/libm-test.inc
Original file line number Diff line number Diff line change
Expand Up @@ -3272,6 +3272,166 @@ lrint_test (void)
}


static void
lrint_test_tonearest (void)
{
int save_round_mode;
START (lrint_tonearest);

save_round_mode = fegetround ();

if (!fesetround (FE_TONEAREST))
{
TEST_f_l (lrint, 0.0, 0);
TEST_f_l (lrint, minus_zero, 0);
TEST_f_l (lrint, 0.2L, 0);
TEST_f_l (lrint, -0.2L, 0);
TEST_f_l (lrint, 0.5L, 0);
TEST_f_l (lrint, -0.5L, 0);
TEST_f_l (lrint, 0.8L, 1);
TEST_f_l (lrint, -0.8L, -1);

TEST_f_l (lrint, 1.4L, 1);
TEST_f_l (lrint, -1.4L, -1);

TEST_f_l (lrint, 8388600.3L, 8388600);
TEST_f_l (lrint, -8388600.3L, -8388600);

TEST_f_l (lrint, 1071930.0008, 1071930);
#ifndef TEST_FLOAT
TEST_f_l (lrint, 1073741824.01, 1073741824);
# if LONG_MAX > 281474976710656
TEST_f_l (lrint, 281474976710656.025, 281474976710656);
# endif
#endif
}

fesetround (save_round_mode);

END (lrint_tonearest);
}


static void
lrint_test_towardzero (void)
{
int save_round_mode;
START (lrint_towardzero);

save_round_mode = fegetround ();

if (!fesetround (FE_TOWARDZERO))
{
TEST_f_l (lrint, 0.0, 0);
TEST_f_l (lrint, minus_zero, 0);
TEST_f_l (lrint, 0.2L, 0);
TEST_f_l (lrint, -0.2L, 0);
TEST_f_l (lrint, 0.5L, 0);
TEST_f_l (lrint, -0.5L, 0);
TEST_f_l (lrint, 0.8L, 0);
TEST_f_l (lrint, -0.8L, 0);

TEST_f_l (lrint, 1.4L, 1);
TEST_f_l (lrint, -1.4L, -1);

TEST_f_l (lrint, 8388600.3L, 8388600);
TEST_f_l (lrint, -8388600.3L, -8388600);

TEST_f_l (lrint, 1071930.0008, 1071930);
#ifndef TEST_FLOAT
TEST_f_l (lrint, 1073741824.01, 1073741824);
# if LONG_MAX > 281474976710656
TEST_f_l (lrint, 281474976710656.025, 281474976710656);
# endif
#endif
}

fesetround (save_round_mode);

END (lrint_towardzero);
}


static void
lrint_test_downward (void)
{
int save_round_mode;
START (lrint_downward);

save_round_mode = fegetround ();

if (!fesetround (FE_DOWNWARD))
{
TEST_f_l (lrint, 0.0, 0);
TEST_f_l (lrint, minus_zero, 0);
TEST_f_l (lrint, 0.2L, 0);
TEST_f_l (lrint, -0.2L, -1);
TEST_f_l (lrint, 0.5L, 0);
TEST_f_l (lrint, -0.5L, -1);
TEST_f_l (lrint, 0.8L, 0);
TEST_f_l (lrint, -0.8L, -1);

TEST_f_l (lrint, 1.4L, 1);
TEST_f_l (lrint, -1.4L, -2);

TEST_f_l (lrint, 8388600.3L, 8388600);
TEST_f_l (lrint, -8388600.3L, -8388601);

TEST_f_l (lrint, 1071930.0008, 1071930);
#ifndef TEST_FLOAT
TEST_f_l (lrint, 1073741824.01, 1073741824);
# if LONG_MAX > 281474976710656
TEST_f_l (lrint, 281474976710656.025, 281474976710656);
# endif
#endif
}

fesetround (save_round_mode);

END (lrint_downward);
}


static void
lrint_test_upward (void)
{
int save_round_mode;
START (lrint_upward);

save_round_mode = fegetround ();

if (!fesetround (FE_UPWARD))
{
TEST_f_l (lrint, 0.0, 0);
TEST_f_l (lrint, minus_zero, 0);
TEST_f_l (lrint, 0.2L, 1);
TEST_f_l (lrint, -0.2L, 0);
TEST_f_l (lrint, 0.5L, 1);
TEST_f_l (lrint, -0.5L, 0);
TEST_f_l (lrint, 0.8L, 1);
TEST_f_l (lrint, -0.8L, 0);

TEST_f_l (lrint, 1.4L, 2);
TEST_f_l (lrint, -1.4L, -1);

TEST_f_l (lrint, 8388600.3L, 8388601);
TEST_f_l (lrint, -8388600.3L, -8388600);

#ifndef TEST_FLOAT
TEST_f_l (lrint, 1071930.0008, 1071931);
TEST_f_l (lrint, 1073741824.01, 1073741825);
# if LONG_MAX > 281474976710656 && defined (TEST_LDOUBLE)
TEST_f_l (lrint, 281474976710656.025, 28147497671065);
# endif
#endif
}

fesetround (save_round_mode);

END (lrint_upward);
}


static void
llrint_test (void)
{
Expand Down Expand Up @@ -5937,6 +6097,10 @@ main (int argc, char **argv)
rint_test_downward ();
rint_test_upward ();
lrint_test ();
lrint_test_tonearest ();
lrint_test_towardzero ();
lrint_test_downward ();
lrint_test_upward ();
llrint_test ();
llrint_test_tonearest ();
llrint_test_towardzero ();
Expand Down
23 changes: 9 additions & 14 deletions sysdeps/ieee754/dbl-64/s_llrint.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* Round argument to nearest integral value according to current rounding
direction.
Copyright (C) 1997, 2004 Free Software Foundation, Inc.
Copyright (C) 1997, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Expand All @@ -23,7 +23,7 @@

#include "math_private.h"

static const long double two52[2] =
static const double two52[2] =
{
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
-4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
Expand All @@ -48,19 +48,14 @@ __llrint (double x)

if (j0 < 20)
{
if (j0 < -1)
return 0;
else
{
w = two52[sx] + x;
t = w - two52[sx];
EXTRACT_WORDS (i0, i1, t);
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
i0 &= 0xfffff;
i0 |= 0x100000;
w = two52[sx] + x;
t = w - two52[sx];
EXTRACT_WORDS (i0, i1, t);
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
i0 &= 0xfffff;
i0 |= 0x100000;

result = i0 >> (20 - j0);
}
result = (j0 < 0 ? 0 : i0 >> (20 - j0));
}
else if (j0 < (int32_t) (8 * sizeof (long long int)) - 1)
{
Expand Down
21 changes: 8 additions & 13 deletions sysdeps/ieee754/dbl-64/s_lrint.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* Round argument to nearest integral value according to current rounding
direction.
Copyright (C) 1997, 2004 Free Software Foundation, Inc.
Copyright (C) 1997, 2004, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Expand Down Expand Up @@ -48,19 +48,14 @@ __lrint (double x)

if (j0 < 20)
{
if (j0 < -1)
return 0;
else
{
w = two52[sx] + x;
t = w - two52[sx];
EXTRACT_WORDS (i0, i1, t);
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
i0 &= 0xfffff;
i0 |= 0x100000;
w = two52[sx] + x;
t = w - two52[sx];
EXTRACT_WORDS (i0, i1, t);
j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
i0 &= 0xfffff;
i0 |= 0x100000;

result = i0 >> (20 - j0);
}
result = (j0 < 0 ? 0 : i0 >> (20 - j0));
}
else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
{
Expand Down
10 changes: 4 additions & 6 deletions sysdeps/ieee754/flt-32/s_llrintf.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* Round argument to nearest integral value according to current rounding
direction.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Expand All @@ -23,7 +23,7 @@

#include "math_private.h"

static const double two23[2] =
static const float two23[2] =
{
8.3886080000e+06, /* 0x4B000000 */
-8.3886080000e+06, /* 0xCB000000 */
Expand All @@ -49,9 +49,7 @@ __llrintf (float x)

if (j0 < (int32_t) (sizeof (long long int) * 8) - 1)
{
if (j0 < -1)
return 0;
else if (j0 >= 23)
if (j0 >= 23)
result = (long long int) i0 << (j0 - 23);
else
{
Expand All @@ -62,7 +60,7 @@ __llrintf (float x)
i0 &= 0x7fffff;
i0 |= 0x800000;

result = i0 >> (23 - j0);
result = (j0 < 0 ? 0 : i0 >> (23 - j0));
}
}
else
Expand Down
Loading

0 comments on commit 6624dbc

Please sign in to comment.