FPC isn't broken. This is by design due to how the x87-coprocessor behaves.
Here is a small program that shows the problem. To see the problem, you *must* compile this with the 32bit compiler. Everything works correctly on the 64bit compiler:
program test_single_7;
uses math;
var
R:single;
got_exception:boolean=false;
begin
R:= 9**9;
try
R:= R*R*R*R*R;
except
got_exception:= true;
writeln('1st exception arrived ok');
end;
if (not got_exception) then writeln('1st exception failed to happen');
try
R:= 9**2;
except
writeln('got 2nd exception - this is incorrect');
end;
end.
This is absolutely distrastrous if you are trying to write rubust and bug-free code. This is a trivial example, but consider the consequences if the code was extremely complex. It would be a nightmare to debug. But more importantly, it would be impossible to get the logic working correctly.
Also please consider the consequences for beginner programmers, trying out Pascal for the first time. Free Pascal is the best compiler available, and problems like this will discourage those people from looking at Pascal. Do you really expect beginner programmers to know and understand the low-level complexities of Intel CPUs, in order to get their code to work correctly?
EDIT - it also appears to be a regression... code generated by the 32bit FPC v3.2.0 behaves correctly, i.e. in the above program the 1st exception arrives.
Your point that every float calculation requires an fwait is not correct.
An fwait is only required inside a try...except statement, and only at the end of the try clause of the statement, like this:
try
float:= (9 ** 9);
float:= (float * float);
float:= (float ** float);
<--- fwait only needs to be inserted here
except writeln('exception')
end;
There many, many features of the Pascal language that slow down execution a little. But that is a small price to pay for the benefits of reliable, easy to debug programs.