[fpc-devel] function IsInt64(Double): Boolean;

Ondrej Pokorny lazarus at kluug.net
Mon May 4 22:34:32 CEST 2026


Hello,

I am having a hard time to write a simple function that determines if a 
Double value is Int64:

function IsInt64(const aNumber: Double): Boolean;

I know about precision problems. I basically want to know if 
Round(aNumber) overflows.

In Delphi, Round() doesn't throw an exception if the value exceeds Int64 
range, so it is safe to compare SameValue(aNumber, Round(aNumber)):

function OXmlIsInt64(const aNumber: Double): Boolean;
begin
     Result := not IsNan(aNumber) and not IsInfinite(aNumber) and 
SameValue(Frac(aNumber), 0) and SameValue(aNumber, Round(aNumber));
end;

That's OK for me.

But in FPC, I get:
Project TestProject raised exception class 'External: FLT INVALID OPERATION'
in Round().

Is there a chance to not throw this exception? I expect this problem so 
I don't want to do something like:

function OXmlIsInt64(const aNumber: Double): Boolean;
begin
   try
     Result := not IsNan(aNumber) and not IsInfinite(aNumber) and 
SameValue(Frac(aNumber), 0) and SameValue(aNumber, Round(aNumber));
   except
     Result := False;
   end;
end;

I tried to switch overflow checks off:
{$OVERFLOWCHECKS OFF}

But obviously it doesn't help (it's a different exception).

----

I'd really like to get rid of the try-except block... It's the same with 
StrToInt() vs TryStrToInt(). IMO there should be a possibility to catch 
expected errors without exceptions.

Any ideas?

Thanks
Ondrej



More information about the fpc-devel mailing list