如何不使用fmod修正C++中浮点数取模报错的算术运算?
报错原因
C++ 原生%取模运算符仅支持整数类型或无作用域枚举类型的操作数,问题代码中(y + w - 0.5)的计算结果为double浮点数类型,直接与整数x执行%运算就会触发类型不匹配报错。
无需fmod的修复方案
- 若可确定参与取模的浮点数运算结果为整数、或可接受精度损失,直接将取模的左操作数强制转换为整数即可,针对示例代码修改后的赋值语句如下:
c = (int)(y + w - 0.5) % x * y;
该修改在示例场景下运行结果为24,符合原始运算逻辑。
- 若需要兼容非整数的浮点数取模场景,可手动实现浮点数取模逻辑,原理为
浮点数取模结果 = 被除数 - 除数 * 商的整数部分,无需调用fmod函数,修改后的赋值语句如下:
c = ((y + w - 0.5) - x * (int)((y + w - 0.5)/x)) * y;
注意:如果参与运算的浮点数为负数,
(int)强制转换的向零截断逻辑可能和预期的取模结果存在差异,可根据业务需求替换(int)为floor/ceil等函数调整取整规则。
内容的提问来源于stack exchange,提问作者Amida
相关产品推荐
相关产品推荐

