I have to apologize because I've fooled myself. Everything works fine in the Haskell side.
The problem was that I tried to pass a float value to printf which is a variadic C function.
According to the C standard / stack overflow:
because printf and its friends are variadic functions, so a float parameter undergoes automatic conversion to double as part of the default argument promotions (see section 188.8.131.52 of the C99 standard).