
























前言
阅读地平线工具链文档,使用银行家舍入法(四舍六入五成双),其设计初衷是解决传统四舍五入的 “系统性偏差”,通过奇偶平衡规则,使大量数据舍入后的均值更接近原始值,尤其适用于金融、科学计算等对精度要求极高的场景。本文对此算法进行介绍。
关键规则
关键规则即五成双,当需要舍弃的部分恰好等于保留部分最后一位的 0.5 时(即“中间值”),则采取 “向最近的偶数舍入” :
- 如果保留部分的最后一位(舍入前)是奇数,则进位(使其变为偶数)。 - 如果保留部分的最后一位(舍入前)是偶数,则直接舍去(保持偶数)。 - 目的:使结果末位为偶数,从而在统计上减少系统性的舍入偏差。 - 原因:在金融、统计和科学计算中,如果对大量以 .5结尾的数据进行传统“四舍五入”,由于总是向上进位,会系统性地导致结果偏高,产生累积误差。“五成双”规则使得 .5有一半概率进位,一半概率舍去,从统计上消除了这种系统性偏差,使结果更精确、更公平。
代码
// 使用“四舍六入五成双”的规则,将浮点数 input舍入到最接近的整数值,并以浮点数的形式返回结果,且不引发浮点异常。 static inline float32_t _round(float32_t const input) { std::fesetround(FE_TONEAREST); // 设置浮点环境的舍入模式 float32_t const result{std::nearbyintf(input)}; // C标准库数学函数 return result; }
注意点:
std::nearbyintf函数不会引发不精确浮点异常(FE_INEXACT),这也是它和 std::rintf的一个主要区别。参考
1. round(37.1455, 3)为什么是37.145(银行家舍入法);
完
各美其美,美美与共,不和他人作比较,不对他人有期待,不批判他人,不钻牛角尖。
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
Simple is clean. Complex is clever.
Logic & Aesthetics
Seeking Ground Truth within the pixels.
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。