::
Non devi usare aritmetica numerica, ma aritmetica delle dimensioni; se \x è un registro numerico non può contenere un numero reale; se è una dimensione lo puoi fare ma mantenendo le dimensioni giuste; nel seguito parto dal presupposto che \x sia una dimensione cioè sia stato dichiarato alla TeX con \newdimen o alla LaTeX con \newlength; allora`\ifdim\dimexpr\x*\x/\p@ >2.25pt …\else ….\fi`
La macro \p@ contiene la lunghezza di 1pt; siccome contiene il segno @ devi usare \makeatletter oppure devi definire una lunghezza \unpunto che contenga il valore di 1pt e usare \unpunto al posto di ]p@.
La speigazione di quello che ho scritto si trova nella documentazione di etex, nell’Hanbook commentato e nella Guid GuIT.
In breve l’espressione prima della disuguaglianza è un valore in punti (il segno negativo del contento di \x è irrilevante), ma il primo prodotto rappresenta un quadrato di lunghezza espressa in punti quadrati, ma dividendolo per 1pt torna ea dessere una semplice lunghezza in punti che può essere confrontata con 2.25pt. Senza dividere per 1pt vorresti confrontare una superficie con una lunghezza 😈
La cosa è ancora più chiara se pensi a come lavora TeX con numeri interi; le lunghezze internamente soni rappresentate con gli scaled point, che sono la frazione 2^{-16} di un punto tipografico; ogni lunghezza ha un valore assoluto rappresentato al massimo da 30 bit, gli ultimi 16 dei quali, quindi, rappresentano la frazione binaria dopo il separatore decimale; quando moltiplichi due lunghezze vai in overflow facilmente, perché al massimo ti viene un risultato di 60 o 61 bit, ma quasi sempre di più di 32 bit, che non sta in una parola di 32 bit; dunque etex mette il prodotto in una longword intera di 64 bit, di cui i 32 bit meno significativi rappresentano la parte fratta; dividendo per la lunghezza di 1p toglie gli ultimi 16 bit meno significativi, quindi se le due lunghezze iniziali non sono troppo grandi, il risultato finale può stare in una parola di 32 bit; non è escluso l’overflow, ma è meno facile che con l’aritmetica su 32 bit. L’algoritmo di etex provvede agli appositi messaggi in caso di overflow, e provvede all’arrotondamento del risultato invece di produrre il suo troncamento come farebbe l’aritmetica intera di tex.
Io non lo uso mai, ma mi pare che il pacchetto calc abbia qualche suo comando che provvede al calcolo del vaoroe assoluto; controlla, ma anche calc usa le espressioni dimensionali di etex.