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
Pubblicato da Gianni
Pubblicato da Gianni