Modulo: differenza tra C99 e Matlab

24 Ottobre 2007
L’altro giorno un mio collega doveva convertire l’implementazione di un algoritmo scritto in Matlab in linguaggio C. L’algoritmo faceva uso della funzione mod di Matlab così il mio collega ha deciso che nella conversione avrebbe usato la funzione fmod della libc. Stranamente benché tutto sembrasse a posto le due implementazioni tiravano fuori risultati diversi. Dopo parecchie ore di mal di testa abbiamo concentrato la nostra attenzione sull’operazione modulo e dai file di help abbiamo letto come Matlab e la libc implementi l’operazione:
Definizione standard C99
The fmod functions return the value x – ny, for some integer n such that, if y is nonzero, the result has the same sign as x and magnitude less than the magnitude of y. If y is zero, whether a domain error occurs or the fmod functions return zero is implementation-defined.

File di help di Matlab
M = mod(X,Y) if Y ~= 0, returns X – n.*Y where n = floor(X./Y). If Y is not an integer and the quotient X./Y is within roundoff error of an integer, then n is that integer. The inputs X and Y must be real arrays of the same size, or real scalars.

Benché le due definizioni si equivalgono dal punto di vista matematico, così come mi assicura una mia collega, dal punto di vista delle implementazioni le funzioni portano a risultati anche molto diversi.
Alcuni esempi

Linguaggio script Matlab versione (R2007b) 7.5 (x86)

mod (-11.4385, 6.28) => 1.1215mod (4.8324, 6.28)   => 4.476

Linguaggio C (x86)

fmod (-11.4385, 6.28) => -5.1585fmod (4.8324, 6.28)   =>  4.8324

Linguaggio python 2.5.1 (x86)

-11.4385 % 6.28 => 1.12154.8324 % 6.28   => 4.8324
Su wikipedia c’è un interessante articolo che illustra come l’operazione modulo varia dal linguaggio di programmazione e dall’hardware sotto stante. Purtroppo non c’è la traduzione in italiano.

La matematica non è un’opinione ma le implementazioni si ;)

Le 3 R di Windows

18 Ottobre 2007
Capita spesso che amici e colleghi si lamentino con me che un programma che usano da tempo ad un certo momento non esegue più una funzione nel modo atteso e sono lì a perdere a volte anche ore provando e riprovando a compiere la stessa operazione per vederla poi fallire.
Dopo ormai anni ad aver assistito alla stessa scena mi sono deciso a fornire questo consiglio per coloro che usano prodotti Microsoft sulla piattaforma Windows: Prima di chiedere aiuto ad un altro essere umano esegui queste operazioni nel seguente ordine: Riprova - Riavvia - Reinstalla.

Riprova

Bisogna dare sempre il beneficio del dubbio al nostro programma. Potrebbe non aver capito bene, quindi riproviamo a ripetere l’operazione e probabile che possa capire meglio .

Riavvia
Forse il nostro programma è in stato confusionale, perché non provare a chiuderlo e riaprirlo?
Be’ potrebbe anche essersi creato un conflitto insanabile tra il nostro programma e Windows. Un bel riavvio al sistema non si nega mai.

Reinstalla

Ormai siamo alla frutta non ci resta che provare a reinstallare l’applicazione se non crea problemi.

OK, il post è chiaramente per sorridere ma a volte, vi assicuro, che seguendo queste indicazioni le cose tornano al loro posto da sole. Provare per credere ;)