控制浮点错误

时间:2014-12-22 11:08:55

标签: floating-point

我试图通过仅使用句点后的2个最重要的值来管理浮点错误:

static float lowerPrecision(float highPrecisionFloat)
{
    char buff[8] = {0};
    sprintf(buff, "%.2f", highPrecisionFloat);
    float lowerPrecisionFloat = atof(buff);
    return lowerPrecisionFloat;
}

void main(void)
{
    float highPrecisionFloat = 127 / 100.0;
    printf("highPrecisionFloat: %.12f\n", highPrecisionFloat);
    float lowerPrecisionFloat = lowerPrecision(highPrecisionFloat);
    printf("lowerPrecisionFloat: %.12f\n", lowerPrecisionFloat);
}

返回:

highPrecisionFloat: 1.269999980927
lowerPrecisionFloat: 1.269999980927

为什么我的实现不起作用(我认为这是atof的错)并且可以修复它吗?

1 个答案:

答案 0 :(得分:1)

1.269999980927是最接近浮点数127/100的十进制表示的第一个数字。你不能把它四舍五入到接近127/100的东西。

可以将多个float值舍入到一组选定的代表中。在某些情况下,这是处理浮点近似的有效策略,这就是你的函数lowerPrecision所做的事情(虽然效率低,并且存在堆栈溢出的有趣风险)。但是该函数不能返回代表127/100的float,因为该浮点数不存在。

二进制浮点类型使用二进制表示,其中1/10和127/10不能用任意数量的小数位数精确表示。您可以选择使用最多8个二进制数字(而不是两个十进制数字)的代表,或者您可以将函数lowerPrecision保持为书面状态,但不管怎样,您可以编写的函数都不会返回浮点数完全代表127/100。

通过将hexadecimal format %a用于浮点值的输入和输出,可以使浮点类型的二进制表示更加内向。这将有助于make it intuitive无法准确表示某些简单的十进制值。