[fpc-pascal] Loss of precision when using math.Max()

Wolf wv99999 at gmail.com
Tue Jul 3 00:13:40 CEST 2018


Not so long ago, Florian was proudly bragging about "Pascal does not 
allow you to shoot yourself in the foot 
<http://www.toodarkpark.org/computers/humor/shoot-self-in-foot.html>"

What about this little program:

program Project1;

var a,b: byte;
begin
   a:=1;
   b:=a*(-1);
   writeln(b);    // result: 255
end.

The result is obviously correct, given how the variables are declared. 
But there are no compiler warnings / errors that the assignment 
b:=a*(-1) is fishy, to put it mildly. And if you are serious about 
strong typing, it ought to be illegal, with a suitable complaint from 
the compiler.

Who is shooting whom in the foot?

Wolf


On 02/07/2018 20:22, Santiago A. wrote:
> 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.
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20180703/0c5be33f/attachment.html>


More information about the fpc-pascal mailing list