You do not need floating point hardware to use floating point math.
IEEE-754 has a number of floating point lengths 80, 64, 32 and now a 16. There are other non-ieee floating point formats. The IEEE format/standard is very painful, almost all of the features are wasted, few know them, and few or none of the languages give you the ability to use them. With compliant hardware you can still fail to meet the spec because the software/operating system is part of it. You are required to provide different answers depending on whether exceptions are trapped for example. You would find non-IEEE floating point formats in DSP's for speed, processor size, etc. They were more closely tuned with what you really used the fpu for and not everything we could ever want and the kitchen sink approach that the IEEE standard uses.
Not every hardware fpu supports every length.
fpu bugs are often solved by not using the hardware for the broken instruction, or the broken instruction is wrapped by software to fix any problems. Hardware may have gotten better in the last 5-10 years but it was difficult to find a hardware fpu without any bugs. To avoid the pentium embarrassment all over again you would need or at least want to fix the bugs in software. the difficulty of the IEEE spec is why it is rare to find a system that completely meets the spec. fixing the bug in software gets into compilers and operating systems, unless you control all three (hardware, compiler, operating system) you are likely to fail that as well.
Normally you compile your program knowing what you expect to run against, at least with ARM you compile for hard float or soft float. It is certainly possible to have the floating point library detect and then use the appropriate solution from there on out so that one binary will work on both. You have to examine each compiler separately to know what the solutions/rules are. Compilers tend to know what platforms normally dont support it and build for soft float by default and other platforms that normally or always have an fpu and normally build for a hardware fpu for example.
Trying to decide when to use it? As a general rule, avoid it unless you really, really, need it. When you do use it there are many many ways to use it wrong, understand how to use it without wasting it, or without getting the wrong answer. You might have been better off with integer math or keeping track of the decimal place yourself.