我实际上已经成功地执行了乘法,但是对于如此简单的事情,它涉及大量浮点运算的操作相当慢:
改进 FP 数学的一个步骤是避免使用float
和double
类型。
// double to float
const float invertedByte = 1/255.0;
// uint8_t to float (twice)
// float to double
// double to uint8_t
return (uint8_t)(((a * invertedByte) * (b * invertedByte)) * 255.0);
// ^---- float product ------------------^ double
更好的 FP 解决方案将使用
const float invertedByte = 1.0f/255.0f;
// unsigned to float (once)
// float to uint8_t
return (uint8_t)( ((unsigned)a * (unsigned)b) * invertedByte);
然而,一个全整数解决方案 - 类似于@Jakub Dóka。
return (uint8_t) (((unsigned)a * (unsigned)b + 255u) >> 8);
或者按照@Paul Hankin的建议
return (uint8_t) ((unsigned)a * (unsigned)b + 127u) / 255u;
另请参阅@Ian Abbott好主意
return ((uint_fast32_t)a * (uint_fast32_t)b * 0x10101u + 0x800000u) >> 24;