Skip to contentSkip to conversation

bug in float on Pentium

DISCUSSION Joe 5 participants 5 messages Apr 14, 2001 – Apr 15, 2001

lore
Share & tools
lore

Joe

author
#0 lore raw

Not sure but I think I found a NEW bug.

I know that there have been some issues with pentiums and floating point arrithmatic, but this takes the cake...

Linux Lserver.org 2.2.18 #43 SMP Fri Mar 9 14:19:41 EST 2001 i586 unknown

Quoted 1 line

kgcc --version

egcs-2.91.66

RH 6.2.x / 7.0

try this program

#include <stdio.h>

int main() {

    char tmpx[100];

char tmpy[100];

double x = 5483.99;
float y = 5483.99;

    sprintf (tmpx, "%f",x );
    sprintf (tmpy, "%f",y );

printf ("%s\n%s\n", tmpx, tmpy);
return 0;
}

I am getting the following as output

joeja@Lserver$ ./testf
5483.990000
5483.990234

what is with the .990234?? it should be .990000

any ideas on this??

--
Joe Acosta ........
home: [email protected]

#1 lore raw
Quoted 3 lines

Not sure but I think I found a NEW bug.
I know that there have been some issues with pentiums and floating point arrithmatic, but this takes the cake...

Hardly. Floats are inaccurate.

#2 lore raw
In reply to Joe
Quoted 8 lines · Joe

Not sure but I think I found a NEW bug.

I know that there have been some issues with pentiums and floating point arrithmatic, but this takes the cake...

Linux Lserver.org 2.2.18 #43 SMP Fri Mar 9 14:19:41 EST 2001 i586 unknown

...

Quoted 4 lines

I am getting the following as output

Quoted 9 lines
joeja@Lserver$ ./testf
5483.990000
5483.990234

what is with the .990234?? it should be .990000

any ideas on this??

Your second number is a 32-bit float - which has roughly 7 digits of
precision. Just like your program output clearly shows.

(I do however fail to see the relevance of this to linux-kernel)

Signature · 6 lines
................................................................
:   [email protected]   : And I see the elder races,         :
:.........................: putrid forms of man                :
:   Jakob Østergaard      : See him rise and claim the earth,  :
:        OZ9ABN           : his downfall is at hand.           :
:.........................:............{Konkhra}...............:
#3 lore raw
In reply to Joe
Quoted 5 lines

double x = 5483.99;
float y = 5483.99;

5483.990000
5483.990234

Well, duh. Floats are less accurate than doubles, so what? Read your C textbook again.

--------------------------------------------------------------

from:     Jonathan "Chromatix" Morton
mail:     [email protected]  (not for attachments)
big-mail: [email protected]
uni-mail: [email protected]

The key to knowledge is not to rely on people to teach you it.

Get VNC Server for Macintosh from http://www.chromatix.uklinux.net/vnc/

-----BEGIN GEEK CODE BLOCK-----
Version 3.12
GCS$/E/S dpu(!) s:- a20 C+++ UL++ P L+++ E W+ N- o? K? w--- O-- M++$ V? PS PE- Y+ PGP++ t- 5- X- R !tv b++ DI+++ D G e+ h+ r++ y+(*) -----END GEEK CODE BLOCK-----

#4 lore raw
In reply to Joe

It's not that you found a new bug or that floats are inaccurate (they are just less exact than doubles)... For example, if you make your program print some more digits, you'll get:

5483.98999999999978172127157449722290039062500000000000 5483.99023437500000000000000000000000000000000000000000

#include <stdio.h>

int main() {

    unsigned int *X;
    unsigned int *Y;

double x = 5483.99;
float y = 5483.99;

    X = (unsigned int *)&x;
    Y = (unsigned int *)&y;

printf ("%60.50lf\n%60.50f\n", x, y);

printf("%lf %x%x %f %x\n", x, X[1], X[0], y, *Y); return 0;
}

which you can verify by hand:

5483.990000 40b56bfd70a3d70a
0 10000001011 1.0101 0110 1011 1111 1101 0111 0000 1010 0011 1101 0111 0000 1010
+ 2^12 * 1.3388647460937499467092948179925 =
5483.989999999999781721271574497222900390625

5483.990234 45ab5fec
0 10001011 1.010 1011 0101 1111 1110 1100
+ 2^12 * 1.338864803314208984375 = 5489.990234375

check out:
http://www.psc.edu/general/software/packages/ieee/ieee.html

l8r

m

Matt Billenstein
mbillens (at) one (dot) net
http://w3.one.net/~mbillens/

----- Original Message -----
From: "Joe" <[email protected]>
To: <[email protected]>
Sent: Friday, April 13, 2001 7:23 PM
Subject: bug in float on Pentium

| Not sure but I think I found a NEW bug.
|
| I know that there have been some issues with pentiums and floating point
| arrithmatic, but this takes the cake...
|
| Linux Lserver.org 2.2.18 #43 SMP Fri Mar 9 14:19:41 EST 2001 i586
| unknown
|
| >kgcc --version
| egcs-2.91.66
|
| RH 6.2.x / 7.0
|
| try this program
|
| #include <stdio.h>
|
| int main() {
|
|     char tmpx[100];
|  char tmpy[100];
|
|  double x = 5483.99;
|  float y = 5483.99;
|
|     sprintf (tmpx, "%f",x );
|     sprintf (tmpy, "%f",y );
|
|  printf ("%s\n%s\n", tmpx, tmpy);
|  return 0;
| }
|
|
| I am getting the following as output
|
| joeja@Lserver$ ./testf
| 5483.990000
| 5483.990234
|
|
| what is with the .990234??  it should be .990000
|
| any ideas on this??
|
| --
| Joe Acosta ........
| home: [email protected]
|
|
|
| -
| To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
| the body of a message to [email protected]
| More majordomo info at  http://vger.kernel.org/majordomo-info.html
| Please read the FAQ at  http://www.tux.org/lkml/