2014-12-22 2 views
0

Я пытаюсь управлять ошибку точки плавающий, используя только 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 

Почему моя реализация ISN» (я предполагаю, что это ошибка), и можно ли это исправить?

ответ

1

1.269999980927 - первые цифры десятичного представления ближайшего поплавка до 127/100. Вы не можете объединить его ближе к 127/100.

Вы можете круглые многие float значения одному из множества выбранных представителей. Это допустимая стратегия в некоторых случаях для работы с приближениями с плавающей запятой, и это то, что делает ваша функция lowerPrecision (хотя и неэффективно и с интересными рисками переполнения стека). Но эта функция не может вернуть номер float, представляющий 127/100, поскольку этот поплавок не существует.

Двоичные типы с плавающей точкой используют двоичное представление, в котором 1/10 и 127/10 не могут быть представлены точно с любым количеством дробных цифр. Вы можете выбрать своих представителей как те, которые используют не более 8 двоичных цифр (вместо двух десятичных), или вы можете сохранить свою функцию lowerPrecision как написано, но в любом случае никакая функция, которую вы можете написать, вернет float, который представляет 127/100 точно.

Вы можете сделать двоичное представление типов с плавающей точкой гораздо более висцеральным, используя hexadecimal format%a для ввода и вывода значений с плавающей запятой. Это поможет make it intuitive, что некоторые простые десятичные значения не могут быть представлены точно.

Смежные вопросы