C++中将对数运算结果转整数时得到错误答案问题咨询
两段表达式的区别
两者核心差异是浮点数精度处理逻辑和取整规则的不同,具体如下:
- 直接强转
int的错误逻辑:
常用编程语言中的log函数默认是自然对数实现,通过换底公式计算其他底的对数时会涉及多次浮点运算,必然存在精度误差。你给出的示例中,数学上精确计算log2(2*(8^8))的结果为25,但实际浮点运算得到的结果可能是24.999999999999996这类略小于真实值的数。而浮点数转int的规则是直接截断小数部分,24.999999999999996 + 1 = 25.999999999999996,截断后得到25,和预期结果不符。 - 加
floor后的正确逻辑:floor函数的作用是向下取整,会返回小于等于当前值的最大整数。哪怕浮点运算结果略小于真实值,floor(24.999999999999996) = 24,再加1得到25,刚好匹配需求的整数部分结果。如果浮点运算刚好得到精确值25.0,floor(25.0) = 25,加1得到26,也符合数学计算的结果。
本质上你要实现的是对log_b(a*x^x)的结果向上取整,floor(val) + 1是工程领域规避浮点精度误差求上取整的常用实现,可以避免精度损失导致的取整错误。
内容的提问来源于stack exchange,提问作者Rohit Sharma
相关产品推荐
相关产品推荐

