use ::std::num::FromPrimitive instead of ::std::num::Zero