是否存在算法为浮点数添加精度外冗余数位?C++代码结果存疑
问题解答
这既不是巧合,也不存在什么“添加冗余数位”的算法,核心原因和浮点数的存储与转换逻辑有关:
3.14f是单精度浮点数(float类型),它遵循IEEE 754标准,用32位固定格式存储。由于3.14无法用二进制浮点数精确表示,内存里存的是它最接近的二进制近似值,这个值是唯一确定的。- 当你用
std::setprecision(20)输出时,程序是把这个固定的二进制浮点数精确转换为十进制字符串。那些看起来超出单精度“有效精度”(约6-7位十进制)的数位,是这个二进制近似值转十进制后的自然结果,不是额外添加的冗余内容。 - 不同程序输出完全相同,是因为它们都严格遵循IEEE 754标准的转换规则,对同一个单精度浮点数的十进制转码逻辑一致,所以得到的字符串完全一致。
举个直观的例子:你把分数1/3写成小数会得到0.3333333333...,后面的无限个3不是随便加的,而是这个分数的精确展开——这里的浮点数转换也是同理,那些“多余”的数位是它真实存储值的精确十进制表达。
内容的提问来源于stack exchange,提问作者Vedant Patil
相关产品推荐
相关产品推荐

