printf("%.5g",0.00390625)输出差异:微软库是否违反银行家舍入规则?
结论:你的判断正确,微软C++标准库此处输出不符合round to even规则
- 首先明确数值前提:你测试所用的目标值为
1/256 = 0.00390625,属于2的负整数次幂,可以被double类型无误差精确表示,不存在浮点精度损失导致的舍入歧义。 - 舍入规则校验:从输出长度判断,本次格式化要求为保留7位小数或5位有效数字。不管按哪种规则,待舍入的截断位都是5,且保留位的最后一位为2(偶数),按照银行家舍入(四舍六入五成双)要求,应当直接舍去末尾的5,最终结果为0.0039062,你的实现和libgcc的输出完全符合规则。
- 微软标准库的问题:微软C++ 2019及更早版本的标准库printf系列函数,长期默认使用传统四舍五入规则,而非C/C++标准规定的round to even默认浮点舍入模式,属于已知的历史遗留问题,确实不符合规范要求。
内容的提问来源于stack exchange,提问作者Mirek Fidler
相关产品推荐
相关产品推荐

