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