Странности с переменной float

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
NemesiS2014
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вс сен 29, 2013 21:14:20

Странности с переменной float

Сообщение NemesiS2014 »

есть такой код:

Код: Выделить всё

char exp= -4;
float fval=280001
while (exp <= -2) {
      fval *= 0.01;
      exp += 2;
    }
По идее этот код 2 раза умножает переменную fval на 0.01
в первом цикле значение fval должно получиться 2800.01, а во втором цикле на выходе из него 28.0001
Но у меня почему-то в первом цикле получается значение 2800.01001, а во втором цикле на выходе 28.0000992
Помогите понять в чем здесь прикол то? :shock:
Реклама
Аватара пользователя
Neekeetos
Держит паяльник хвостом
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула
Контактная информация:

Re: Странности с переменной float

Сообщение Neekeetos »

NemesiS2014 писал(а):Помогите понять в чем здесь прикол то? :shock:
Число с плавающей точкой одинарной точности дает всего 7-8 значащих (десятичных) разрядов. Посчиталось верно, в рамках возможностей флоата, обычный гцц тоже выдает 2800.010010 28.000099
Информация по RLC mini находится >тут<
Реклама
Аватара пользователя
NemesiS2014
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Вс сен 29, 2013 21:14:20

Re: Странности с переменной float

Сообщение NemesiS2014 »

Но я все-равно не понимаю откуда взялась эта дополнительная единица в конце первого цикла и как этого избежать? Ведь в конце первого цикла должно получиться число 2800.01 а не 2800.01001 или это глюк gcc? Но gcc я обновил и все-равно такая-же фигня. Ведь даже простой допотопный калькулятор считает лучше.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Странности с переменной float

Сообщение uk8amk »

Это какбы ошибка округления. Дело в том что дробные числа вычисляются не по основанию 10 как мы привыкли считать в обычной жизни. Кроме того результат может зависеть от реализации мат. библиотеки(если компилятор отклоняется от стандарта).
Для более точного вычисления малых чисел используйте тип двойной точности double.
Реклама
Эиком - электронные компоненты и радиодетали
misyachniy
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт июл 02, 2013 09:17:49

Re: Странности с переменной float

Сообщение misyachniy »

NemesiS2014 писал(а):Но я все-равно не понимаю откуда взялась эта дополнительная единица в конце первого цикла и как этого избежать? Ведь в конце первого цикла должно получиться число 2800.01 а не 2800.01001 или это глюк gcc? Но gcc я обновил и все-равно такая-же фигня. Ведь даже простой допотопный калькулятор считает лучше.
Простой допотопный калькулятор считает в целых числах.
Отдельно считает положение запятой.
В компьютерах используется двоичное кодирование
Вес разрядов равен степеням двойки 1/2 , 1/4, 1/8 ...
Из них набирается число.

Хотите абсолютно точно?
Ищите/пишите специальную библиотеку.
Реклама
Ответить

Вернуться в «ARM»