为什么std::round提供返回long和long long的版本,而std::floor等函数没有?
关于std::round独有整数返回签名的设计考量
这一设计并非历史遗留问题,核心是使用场景差异、类型安全保障和C标准对齐三个层面的考量:
- 第一是使用场景的需求差异
std::floor、std::ceil、std::trunc三个函数的典型使用场景是浮点运算流程的中间步骤:开发者通常需要将取整后的结果继续参与乘法、累加等浮点计算,本身需要的返回值仍然是浮点类型,鲜有直接转整数的需求。
而std::round的使用场景完全相反:绝大多数调用场景下,开发者调用它就是为了得到一个可以直接用于索引、计数、整数算术的整数值,而非继续参与浮点运算。如果只有浮点返回的签名,开发者需要手动做强制类型转换,不仅冗余,还容易引入不易排查的错误。 - 第二是类型安全的保障
手动将std::round返回的浮点值强转整数的行为存在未定义行为风险:如果浮点结果超出了目标整数类型的表示范围,强制转换的行为是完全未定义的。标准库提供的返回long的std::lround、返回long long的std::llround会对这种越界情况做明确的标准化处理:符合规范的实现会触发对应的浮点异常,或返回实现定义的错误值,完全避免了未定义行为的风险。 - 第三是对C99标准的对齐
C11的数值库设计完全对齐了C99的标准库规范,而C99在新增round系列函数时,就已经基于实际开发者的使用统计,仅为round提供了整数返回的lround、llround变体,其他三个取整函数没有对应的变体,C11只是沿用了这一经过实践验证的设计。
补充说明:后续C++23标准已经补充了std::lfloor、std::llfloor等对应另外三个函数的整数返回重载,也是因为后来这些场景的需求有所上升。
内容的提问来源于stack exchange,提问作者Alessandro Teruzzi
相关产品推荐
相关产品推荐

