The result of the C program you gave (BTW, you forgot the ; after the
second variable declaration ;) is:

0.000000 < 0.001000: 1[

So, I went on to try the GDB stuff, and here's what I get:

[root@localhost test]# gdb ruby
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "i586-mandrake-linux"...
(gdb) b rb_flo_lt
Function "rb_flo_lt" not defined.
(gdb) r -e 'p(3.330669074e-16 < 0.001)'
Starting program: /downloads/test/ruby -e 'p(3.330669074e-16 < 0.001)'

warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0.000000 < 0.001000: 1

Program exited normally.
(gdb) p *(struct RFloat*)a
No struct type named RFloat.
(gdb) p *(struct RFloat*)b
No struct type named RFloat.
(gdb)

-Scott-

BTW, feel free to send me any patches you want to try solving this
"problem" with...... My C is way too rusty to try and figure this out
myself, or even with you...... But, I'll do what I can in other ways.

If it helps any..... A few other programs have given me trouble with
the aggressive optimisations I was running on the code.

For awhile, I was using most of the flags listed
here: http://athlonlinux.org/optimize/flags.shtml I've since installed
the default Mandrake compilers. Maybe one, or some, of these are known
to cause fits with Ruby? I'll recompile Ruby tomorrow maybe, and run
these tests again. See what happens.

-Scott-

> Hi,
>
> Not the worst, but I still have no idea about what make this false.
>
> If this program gives something like "3.330669074e-16, 0.001: 1",
> it's the compiler's fault.
>
>   int
>   main() {
>     double a = 3.330669074e-16;
>     double b = 0.001
>     printf("%lf < %lf: %d\n", a, b, a < b);
>     return 0;
>   }
>
> If not, try:
>
>   # gdb ruby
>   (gdb) b rb_flo_lt
>   (gdb) r -e 'p(3.330669074e-16 < 0.001)'
>   (gdb) p *(struct RFloat*)a
>   (gdb) p *(struct RFloat*)b
>
> Thank you.
>
>                                                         matz.