реклама на сайте
подробности

 
 
> Не работает правильно, вычисление float в Keil, Деление на 10
_Алекс
сообщение Feb 14 2017, 05:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Код округление числа до десятых.

float x = 0;

x = 401 * 0.0625; //25.0625
x = x * 10; //250.625
x = x + 0.5; //251.125
x = floor(x); //251
x = x / 10; // Ошибка!

При делении 251 на 10, вроде должно быть 25.1, а получается 25.0999995.
Если float поменять на double, работает. Но, в маем случае очень не удобно использовать double.
Код в другой среде, работает и с float.
Понято, что происходит потеря точности.

Может есть другой способ округлить число до десятых.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 14 2017, 06:40
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (_Алекс @ Feb 14 2017, 07:21) *
Понято, что происходит потеря точности.
или число 25.1 невозможно представить типом float с принятым у кейла размером мантиссы. Проверьте просто x = 25.1;

не слушайте psL, он продемострировал незнание основ языка.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
psL
сообщение Feb 14 2017, 09:11
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Цитата(Сергей Борщ @ Feb 14 2017, 09:40) *
или число 25.1 невозможно представить типом float с принятым у кейла размером мантиссы. Проверьте просто x = 25.1;


не слушайте Борща с его принятым размером мантисы.

Keil использует IEEE-754:
http://www.keil.com/support/man/docs/armli...58938949149.htm

которого достаточно для представления 25.1, можно проверить, например, здесь:
https://www.h-schmidt.net/FloatConverter/
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Feb 14 2017, 16:24
Сообщение #4


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(psL @ Feb 14 2017, 04:11) *
не слушайте Борща с его принятым размером мантисы.

Keil использует IEEE-754:
http://www.keil.com/support/man/docs/armli...58938949149.htm

которого достаточно для представления 25.1, можно проверить, например, здесь:

Вы просто не понимаете, как работает представление чисел с плавающей точкой. 25.1 не представляются точно в двойчной системе.

Чтобы было (я надеюсь) понятно, ответьте на простой вопрос - сколько надо ДЕСЯТИЧНЫХ разрядов чтобы ТОЧНО представить число 1/3? Теперь понятно? 251/10 в двоичной системе это абсолютно такая же ситуация.

Conan, cheers.gif

Цитата(psL @ Feb 14 2017, 07:03) *
Спасибо, конечно, но Вы бы лучше мысль свою пояснили про приведение типов. Смысл моего предложения ТС был в том, что при делении на 10 происходит приведение целого к вещественному с потерей точности, а при умножении вещественных точность выше, чем при делении. В чем я не прав? Только своими словами. Не нужно "братву с википедии" подтягивать.

Ерунда. Приведение ЦЕЛОГО к вещественному происходит без потери точности.
Поделить на 10 и умножить на 0.1 дадут одинаковый результат, хотя теоретически делить даже лучше, потому что в этом случае оба аргумента представлены абсолютно точно, в отличии от 0.1.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Алекс   Не работает правильно, вычисление float в Keil   Feb 14 2017, 05:21
- - psL   попробуйте поделить на 10.0 или умножить на 0.1f   Feb 14 2017, 05:48
||- - Сергей Борщ   QUOTE (psL @ Feb 14 2017, 11:11) Keil исп...   Feb 14 2017, 10:00
|||- - psL   Цитата(Сергей Борщ @ Feb 14 2017, 13:00) ...   Feb 14 2017, 12:03
|||- - Сергей Борщ   QUOTE (psL @ Feb 14 2017, 14:03) В чем я ...   Feb 14 2017, 14:19
|- - ar__systems   Цитата(Сергей Борщ @ Feb 14 2017, 01:40) ...   Feb 14 2017, 16:06
- - k155la3   Цитата(_Алекс @ Feb 14 2017, 09:21) Код о...   Feb 14 2017, 06:49
- - Ruslan1   Цитата(_Алекс @ Feb 14 2017, 07:21) При д...   Feb 14 2017, 08:10
- - _Алекс   Ерунда, похоже, с Keil. double Round (double x...   Feb 14 2017, 09:17
- - HardEgor   Цитата(_Алекс @ Feb 14 2017, 12:21) x = 4...   Feb 14 2017, 09:25
|- - _Алекс   Цитата(HardEgor @ Feb 14 2017, 13:25) А о...   Feb 14 2017, 09:32
- - Lagman   вот есть еще калькулятор который показывает и 25.1...   Feb 14 2017, 15:14
- - conan   В двоичном формате с плавающей запятой точно предс...   Feb 14 2017, 16:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 07:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016