如何在保留原浮点计算逻辑下缓解特定舍入误差?
浮点计算舍入误差缓解咨询
维基百科关于“guard bits(保护位)”的条目提供了如下示例代码:
#include <stdio.h> int main(){ double a; int i; a = 0.2; a += 0.1; a -= 0.3; for (i = 0; a < 1.0; i++) a += a; printf("i=%d, a=%f\n", i, a); return 0; }
我使用Zen2架构的R7 4800H处理器,通过命令gcc Guard_digit.c -std=c17 -march=znver2 -pedantic -O0 -o With_Guard_digit.o编译上述Guard_digit.c源码,输出结果与维基百科一致:i=54, a=1.000000。
正如一份技术笔记所述,IEEE标准已实现guard digit(保护位):
IEEE标准要求在单精度表示隐含的24位尾数之外,额外使用3个低有效位。
尾数格式加额外位:1.XXXXXXXXXXXXXXXXXXXXXXX 0 0 0 ^ ^ ^ ^ ^ | | | | | | | | | - sticky bit (s,粘滞位) | | | - round bit (r,舍入位) | | - guard bit (g,保护位) | - 23 bit mantissa from a representation(表示中的23位尾数) - hidden bit(隐藏位)
技术问询
是否可通过修改代码或其他方式,在保留原计算逻辑(不直接设置a = 0;)的前提下,缓解该浮点计算的舍入误差,使输出结果类似i=108, a=1.000000?
补充说明:我希望解决的是该特定浮点计算场景的舍入问题,而非通用情况,目前该问题已超出我的知识范围。
内容的提问来源于stack exchange,提问作者An5Drama
相关产品推荐
相关产品推荐

