[fpc-pascal] Loss of precision when using math.Max()
Jim Lee
jlee54 at gmail.com
Tue Jul 3 19:26:03 CEST 2018
On 07/03/18 05:33, Wolf wrote:
>
> The major shortcoming of this thread, the way I see it, is that the
> answer provided explains what the compiler does, but not why the key
> authors of Free Pascal have made these choices. What their choices
> achieve is a substantial watering-down of what is supposedly Pascal's
> most significant paradigm: strong typing. As Jim Lee points out,
> strong typing does limit utility - but if utility is first concern, a
> weakly typed language such as C would be more appropriate.
>
> When looking at the (partial) disassembly of my little program, we see
> to what degree the compiler writers have sacrificed strong typing:
>
> /*a:=1;*
> movb $0x1,0x22de87(%rip) # move 1 as single byte into 8 bit
> wide variable A
> *b:=a*(-1);*
> movzbl 0x22de80(%rip),%eax # move A into register %EAX and
> convert to 32 bit
> neg %rax # negate what is in %EAX
> mov %al,0x22de87(%rip) # extract the low 8 bit from %EAX
> and store it in variable B
> *writeln(b); // result: 255*/
> . . .
>
> This was compiled without any optimizations. As you can see, the
> brackets are ignored, as is the fact that variables A and B were
> supposed to be multiplied. In other words, the compiler has optimized
> the code, where it was not supposed to do so. It has also replaced
> byte typed values with longint typed values. It has taken my code and
> translated it as if I had written
> / var
> a: byte;
> b: longint;//
> //begin
> a:=1;
> b:=-longint(a); // convert A to a longint and negate it,
> then save result in B
> writeln( (Lower(b) ); // 'Lower' is a fictional typecast to
> denote that I only use the %AL portion of the %EAX register for the result
> end./
> Which is quite a bit different from what I did program. Sorry if I am
> picky here, but this is the type of bug you can expect in software if
> you test using examples, and not through rigorous reasoning. And this
> is the reason why the original Borland Pascal had range checking
> built-in. If you activate it, the compiler does complain, both on my
> little program and on Jim's.
> But by now, range checking is optional, and Lazarus at least does not
> even activate it by default.
> But range checking is not the same as type checking, so I regard it as
> a crutch, a work-around that needs to be taken because the compiler
> does not adhere to (the spirit of) strong typing. And in this sense,
> what I submit here represents the same issue as what is given in the
> subject string if the whole thread:
>
> Strong typing, and also readability, has been sacrificed on the altar
> of utility, by using implicit type conversions.
>
> Maybe we do get some views from the key authors of Free Pascal.
>
>
> Wolf
>
I didn't fully understand the intent of your first post, but now I get
what you're saying.
I tend to agree. Strict typing is the main thing that separates Pascal
from C, conceptually. I'd rather not see them converge.
-Jim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20180703/cc109384/attachment.html>
More information about the fpc-pascal
mailing list