Una conversación reciente sobre el software libre de errores en el trabajo ha llevado a una discusión sobre TeX (que se considera prácticamente libre de errores, aunque técnicamente podría ser falso). Dado que el código fuente de TeX está ampliamente documentado en"TeX: el programa", echamos un vistazo al interior y elegimos un procedimiento que no estaba claro a primera y segunda vista. Es una implementación de print_int
, que es §65 en ese libro en la página 28. Su documentación dice:
@ 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.
El procedimiento en sí se ve así (código tomado de la fuente 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;
Si bien el algoritmo en sí es bastante comprensible (después de todo, solo imprime un número), no pudimos entender qué significado tiene el número 100000000 en el contexto de los compiladores Pascal de esa época. La documentación menciona desbordamientos, sin embargo, esperaría que se produjera un desbordamiento en un límite de "potencia de dos" y no en un límite de "potencia de diez".
¿Cuál es la explicación o significado de este número? ¿Es esto un compilador o una peculiaridad del estándar del lenguaje?