Bug 13955 - logbf() produces wrong results for subnormal 'float' numbers
Summary: logbf() produces wrong results for subnormal 'float' numbers
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: math (show other bugs)
Version: 2.11
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-04-06 14:17 UTC by Bruno Haible
Modified: 2014-06-25 11:20 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments
test case (214 bytes, text/x-csrc)
2012-04-06 14:17 UTC, Bruno Haible
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Bruno Haible 2012-04-06 14:17:20 UTC
Created attachment 6325 [details]
test case

Seen on glibc 2.11 Linux/PowerPC,
on glibc 2.7 Linux/SPARC,
on glibc 2.7 Linux/HP-PA.

The function logbf() produces a wrong result for subnormal (denormalized)
arguments.

POSIX:2008 specifies the behaviour of this function for subnormal numbers:
<http://pubs.opengroup.org/onlinepubs/9699919799/>.
In particular, if x = 2^i is > 0, logb(x) must be = i.

But in glibc on the specified platforms, for i < FLT_MIN_EXP-1, logbf(x) is too
large.

How to reproduce:
================================== foo.c ==================================
#include <float.h>
#include <math.h>
volatile float x;
int main ()
{
  int i;
  for (i = 0, x = 1.0f; i >= FLT_MIN_EXP - 1; i--, x *= 0.5f)
    ;
  /* Here i = FLT_MIN_EXP - 2. Either x = 2^i is subnormal or x = 0.0.  */
  if (x > 0.0f && !(logbf (x) == (float)i))
    return 1;
  return 0;
}
===========================================================================
$ gcc foo.c -Wall -lm
$ ./a.out; echo $?

Expected result:
0

Actual result:
1
Comment 1 Adhemerval Zanella Netto 2012-05-10 23:46:56 UTC
Fix commited to master (89c9aa491a7cee97bf78a29cddbf0a25c902a671).
Comment 2 Joseph Myers 2012-05-11 09:25:34 UTC
I presume you intended to close this as fixed....