El 01/07/2018 a las 10:27, C Western escribió:
On 29/06/18 21:55, Sven Barth via fpc-pascal wrote:

More confusingly, if a single variable is used, the expected Max(Double, Double) is called:

function Max(a, b: Double): Double; overload;
begin
  WriteLn('Double');
  if a > b then Result := a else Result := b;
end;

function Max(a, b: Single): Single; overload;
begin
  WriteLn('Single');
  if a > b then Result := a else Result := b;
end;

var
  v1: Double;
  v2: Single;
begin
  v1 := Pi;
  v2 := 0;
  WriteLn(v1);
  WriteLn(Max(v1,0));
  WriteLn(Max(v1,0.0));
  WriteLn(Max(v1,v2));
end.

Prints:
 3.1415926535897931E+000
Single
 3.141592741E+00
Double
 3.1415926535897931E+000
Double
 3.1415926535897931E+000

If this is not a bug, it would be very helpful if the compiler could print a warning whenever a value is implicitly converted from double to single.
Well, pascal is a hard typed language, but not that hard in numeric issues. I think it is a little inconsistent that it implicitly converts '0.0' to double but '0 to single.

Nevertheless, I think it is a bug. It doesn't choose the right overloaded function

But the main is this:
you have several overload options for max
1 extended, extended
2 double, double
3 single, single
4 int64, int64
5 integer, integer

When it finds (double, single), why does  it choose (single, single) instead of (double, double)? The natural behavior should be to widen to the greater parameter, like it does in expressions.

--
Saludos

Santiago A.

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

Reply via email to