Uma conversa recente sobre software livre de bugs em funcionamento levou a uma discussão sobre o TeX (que é considerado virtualmente livre de bugs, embora possa ser tecnicamente falso). Como o código-fonte do TeX está extensivamente documentado em"TeX: O Programa", demos uma olhada interna e escolhemos um procedimento que não ficou claro à primeira e à segunda vista. É uma implementação de print_int
, que é §65 naquele livro na página 28. Sua documentação diz:
@ The following procedure, which prints out the decimal representation of a given integer |n|, has been written carefully so that it works properly if |n=0| or if |(-n)| would cause overflow. It does not apply |mod| or |div| to negative arguments, since such operations are not implemented consistently by all \PASCAL\ compilers.
O procedimento em si é assim (código retirado da fonte WEB):
procedure print_int(@!n:integer); {prints an integer in decimal form}
var k:0..23; {index to current digit; we assume that $|n|<10^{23}$}
@!m:integer; {used to negate |n| in possibly dangerous cases}
begin k:=0;
if n<0 then
begin print_char("-");
if n>-100000000 then negate(n)
else begin m:=-1-n; n:=m div 10; m:=(m mod 10)+1; k:=1;
if m<10 then dig[0]:=m
else begin dig[0]:=0; incr(n);
end;
end;
end;
repeat dig[k]:=n mod 10; n:=n div 10; incr(k);
until n=0;
print_the_digs(k);
end;
Embora o algoritmo em si seja bastante compreensível (afinal, ele está apenas imprimindo um número), não conseguimos entender qual o significado do número 100000000 no contexto dos compiladores Pascal da época. A documentação menciona estouros, no entanto, eu esperaria que um estouro acontecesse em um limite de "potência de dois" e não em "potência de dez".
Qual é a explicação ou significado deste número? Isso é um compilador ou uma peculiaridade do padrão de linguagem?