My Math::BigApprox is smarter than regular floating point numbers. It knows that $x == $y iff $x eq $y so you won't have that problem when using it:
use Math::BigApprox 'c';
my $x= c(1);
while( $x < 2 ) {
print "$x\n";
$x += 0.1;
}
print "Stop: x=$x\n";
print "Not 2\n" if $x != 2;
and such numbers have about the same precision as floating point when using such small numbers, they don't have a big performance impact (mostly just the cost of overload.pm), and you can compute 500,000! (factorial, about 1.0228e+2632341) without overflowing nor taking all day.
...which gives me another idea for a very simple module. Math::Eq ?