[fpc-pascal] compare currency and double

2014-12-07 Thread Xiangrong Fang
Hi All,

I have the following code:

var
  val: Currency;
  res: Double;
begin
  val := 2345.67;
  res := 1e300;
  if val >= res then WriteLn('val >=res')
  else WriteLn('val < res');
end;

The program compile and runs correctly on Linux x64, and Win7 32bit, but
failed (SIGFPE) on Win7 64bit.

Can I safely compare a Currency against a Double?

Thanks!

Xiangrong
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] compare currency and double

2014-12-07 Thread Jonas Maebe
On 07/12/14 15:44, Xiangrong Fang wrote:
> I have the following code:
> 
> var
>   val: Currency;
>   res: Double;
> begin
>   val := 2345.67;
>   res := 1e300;
>   if val >= res then WriteLn('val >=res')
>   else WriteLn('val < res');
> end;
> 
> The program compile and runs correctly on Linux x64, and Win7 32bit, but
> failed (SIGFPE) on Win7 64bit.

That's because currency has a bigger range than double. On Linux x64 and
Windows 32 bit, the x87 fpu can be used, so the currency value can be
converted to an 80 bits extended value. The x87 and hence also its 80
bits extended type have been deprecated on Win64, so FPC doesn't use it
there anymore.

> Can I safely compare a Currency against a Double?

No. It generally also doesn't make sense, because the whole point of
using currency is to have an exact value without rounding errors, while
a double value by nature very often contains rounding errors.


Jonas

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal