digitalmars.D.bugs - old sorting error
- Helmut Leitner (51/51) Oct 14 2004 I documented this problem long ago. It may lead to errors
- Stewart Gordon (10/30) Oct 14 2004 It probably was never fixed.
- Helmut Leitner (6/7) Oct 14 2004 sorry, typo, it was
I documented this problem long ago. It may lead to errors
in sorting floating point arrays:
===================================================== April 6, 2004 ===
a number of floating point type arrays don't sort correctly und certain
circumstances. This is the code:
class TypeInfo_d : TypeInfo
{
...
int compare(void *p1, void *p2)
{
return *(double *)p1 - *(double *)p2;
}
...
}
When values are small (I tried to sort uSecond timings like the following):
sectab[0] 0.0000070792
sectab[1] 0.0000072514
sectab[2] 0.0000066818
sectab[3] 0.0000067485
sectab[4] 0.0000066986
sectab[5] 0.0000068492
sectab[6] 0.0000066601
sectab[7] 0.0000065775
sectab[8] 0.0000068234
sectab[9] 0.0000067371
sectab[10] 0.0000067350
rounding will make the return value unusable and the array remains unsorted.
I think similar problems would turn up, when numbers are too large for the
int range.
The typical construction that you use in other places, will avoid the problem:
type a = *(type *) p1;
type b = *(type *) p2;
return a < b ? -1 : a > b ? 1 : 0;
==============================================================
Although Walter acknowledged the problem at that time, the compare code
now contains casts, but is virtually unchanged and is still not working:
// double
class TypeInfo_d : TypeInfo
{
char[] toString() { return "double"; }
....
int compare(void *p1, void *p2)
{
return cast(int)(*cast(double *)p1 - *cast(double *)p2);
}
...
}
Don't no whether the bug crept back in or it was never corrected.
--
Helmut Leitner leitner hls.via.at
Graz, Austria www.hls-software.com
Oct 14 2004
Helmut Leitner wrote:
<snip>
Although Walter acknowledged the problem at that time, the compare code
now contains casts, but is virtually unchanged and is still not working:
// double
class TypeInfo_d : TypeInfo
{
char[] toString() { return "double"; }
....
int compare(void *p1, void *p2)
{
return cast(int)(*cast(double *)p1 - *cast(double *)p2);
}
...
}
Don't no whether the bug crept back in or it was never corrected.
It probably was never fixed.
Someone really needs to go through and sanity-check all the comparators.
This comparison is only valid for character/integral types smaller
than int.
I reported the problem in the typo for int, and it was fixed in the next
release or two. In long, it was correct when I first discovered it. So
why is double wrong?
Stewart.
Oct 14 2004
Helmut Leitner wrote:===================================================== April 6, 2004 ===sorry, typo, it was ===================================================== April 6, 2003 === -- Helmut Leitner leitner hls.via.at Graz, Austria www.hls-software.com
Oct 14 2004









Stewart Gordon <smjg_1998 yahoo.com> 