Search code examples
delphifiremonkey

Comparing float with small integer


If I have

f: Single;
F := 0;
if F <> 0 then raise exception.create('xxx');

does this comparison will work fine in any platforms? I mean do I will need to do round(f) <> 0 in some platforms? I know that on Windows doing F <> 0 is fine because 0 is an integer but I m curious for other platforms


Solution

  • In the title, you ask for a general answer, and in the body, you ask for a specific case. I'm not sure which answer you are trully interested in. But as a general case, the answer is "It depends".

    As other have commented, your specific example will never raise, but it does not mean it's safe to compare a float to 0.

    Take this exemple :

    procedure TForm5.Button1Click(Sender: TObject);
    var
      F: single;
    begin
      F := (7 / 10);
      F := F - 0.7;
      if F <> 0 then
        raise Exception.Create('Error Message');
    end;
    

    This will (as far as I know) always raise.

    Also, round(f) <> 0 wouldn't be the way to go about this. Comparevalue(F, 0, ????) <> EqualsValue would be.

    As to the "why" of all this, this has been answered (probably numerous times) on SO. (you can start here)