数字的浮点错误的上限

时间:2013-05-23 13:44:57

标签: c floating-point

关于这个问题有很多问题(和答案),但我太厚了,无法弄明白。在C中,对于给定类型的浮点,例如double:

double x;
scanf("%lf", &x);

是否有一种通用方法来计算传递给scanf的小数部分字符串与现在x内部表示之间的误差的上限(尽可能小)?< / p>

如果我理解正确,有时会出现错误,并且随着小数部分的绝对值增加它会增加(换句话说,0.1会有点偏差,但100000000.1将会更多关闭)。

2 个答案:

答案 0 :(得分:1)

C标准的这一方面稍微不明确,但您可以预期从十进制到double的转换在原始版本的Unit in the Last Place之内。

您似乎正在寻找转换的绝对错误的界限。通过上述假设,您可以将double的约束计算为DBL_EPSILON * xDBL_EPSILON通常为2 ^ -52。

可以按如下方式计算转换期间可能产生的错误的更严格限制:

double va = fabs(x);
double error = nextafter(va, +0./0.) - va;

最佳转换功能可确保在默认的舍入到最接近模式下转换为半个ULP。如果您使用具有此保证的转换函数,则可以将绑定的I商品除以2。


当以十进制表示的原始数字为0或其绝对值介于DBL_MIN(约2 * 10 ^ -308)和DBL_MAX(约2 * 10)之间时,以上情况适用^ 308)。如果非空十进制数的绝对值低于DBL_MIN,则绝对误差仅受DBL_MIN * DBL_EPSILON的限制。如果绝对值高于DBL_MAX,则转换后可能会获得无穷大。

答案 1 :(得分:0)

你不能用基数10来考虑这一点,错误在基数2中,它不一定指向基数10中的特定小数位。

你的问题有两个潜在的问题,第一个scanf采用ascii字符串并将其转换为二进制数,这是一个使用多个C库的软件。我已经看到例如编译时解析与运行时解析在同一系统上给出不同的转换结果。所以在错误方面,如果你想要一个确切的数字自己转换它并将那个二进制数放在寄存器/变量中,否则接受转换得到的结果并理解转换上可能存在舍入或削波,你没想到(这导致准确性问题,你没有得到你期望的数字。)

帕斯卡已经回答了第二个真正的问题。如果是二进制位,你只有x数。就小数而言,如果您有3位小数,则数字1.2345将必须表示为1.234或1.235。对于二进制文件,如果你有3位尾数则相同,然后1.0011是1.001或1.010,具体取决于舍入。 IEEE浮点数的尾数长度已有详细记录,您只需谷歌查找每个精度的二进制位数。