summaryrefslogtreecommitdiffstats
path: root/sys/modules/aic7xxx
diff options
context:
space:
mode:
authordas <das@FreeBSD.org>2004-06-09 21:24:52 +0000
committerdas <das@FreeBSD.org>2004-06-09 21:24:52 +0000
commit7765c930887fbaf09593a81e647399ee248bdaa4 (patch)
treec642468335763089187fdfce8bdd2da0f215037b /sys/modules/aic7xxx
parent186c7aa46c6bfc0570f6665adb6e290c177923f7 (diff)
downloadFreeBSD-src-7765c930887fbaf09593a81e647399ee248bdaa4.zip
FreeBSD-src-7765c930887fbaf09593a81e647399ee248bdaa4.tar.gz
Fix a bug where rintf() rounded the wrong way in round-to-nearest mode
on all inputs of the form x.75, where x is an even integer and log2(x) = 21. A similar problem occurred when rounding upward. The bug involves the following snippet copied from rint(): i>>=1; if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0); The constant 0x100000 should be 0x200000. Apparently this case was never tested. It turns out that the bit manipulation is completely superfluous anyway, so remove it. (It tries to simulate 90% of the rounding process that the FPU does anyway.) Also, the special case of +-0 is handled twice (in different ways), so remove the second instance. Throw in some related simplifications from bde: - Work around a bug where gcc fails to clip to float precision by declaring two float variables as volatile. Previously, we tricked gcc into generating correct code by declaring some float constants as doubles. - Remove additional superfluous bit manipulation. - Minor reorganization. - Include <sys/types.h> explicitly. Note that some of the equivalent lines in rint() also appear to be unnecessary, but I'll defer to the numerical analysts who wrote it, since I can't test all 2^64 cases. Discussed with: bde
Diffstat (limited to 'sys/modules/aic7xxx')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud