@@ -1757,10 +1757,17 @@ end;
{$ifndef FPC_SYSTEM_HAS_FRAC}
- function fpc_frac_real(d : ValReal) : ValReal;compilerproc;
- begin
- result := d - Int(d);
- end;
+function fpc_frac_real(d : ValReal) : ValReal;compilerproc;
+ var
+ i: integer;
+ begin
+ i := (float64high(d) and $7ff00000) shr 20;
+ if i=$7FF then
+ { return NaN }
+ result := (d-d)/0.0
+ else
+ result := d - Int(d);
+ end;
{$endif}
@@ -0,0 +1,24 @@
+{ %OPT=-O- }
+uses
+ math,sysutils;
+var
+ d : double;
+ s : string;
+begin
+ SetExceptionMask([exInvalidOp]);
+ d:=Infinity;
+ str(frac(d),s);
+ writeln(s);
+ if pos('Nan',s)=0 then
+ halt(1);
+ d:=-Infinity;
+ d:=NaN;
+end.