FLProg
Вход на сайт
Логин:
Пароль:
Мы в VK
Поиск
Статистика


Яндекс.Метрика
Суббота, 03.12.2016, 18:39
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: support, Сергей 
Форум » Основной » Спросить у знатоков » вычитание float из float = ересь (выморозило)
вычитание float из float = ересь
SirYorik
Дата: Вторник, 23.02.2016, 09:50 | Сообщение # 1
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
простая задача, вычесть из меньшего большее, получается положительное число.

это баг, или куда? копаюсь так и сяк уже больше 2х часов.



компилится в:
Код
float _gtv6 = 0;
float _gtv13 = 1;
float _gtv15 = 0;
...
UB_103065410_ubi_128251383 = (_gtv6)-(_gtv13);
UB_103065410_Instance2 = _func_UB_103065410(UB_103065410_Instance2, UB_103065410_ubi_128251383);
_gtv15 = UB_103065410_Instance2.ubo_91927667;
...
if (1){Serial.println(((( _floatToStringWitRaz(_gtv6,10))) + (String(" - ")) + (( _floatToStringWitRaz(_gtv13,10))) + (String(" = ")) + (( _floatToStringWitRaz(_gtv15,10)))));}

_func - это я пытался играться с округлением, без него тоже самое, округление только в некоторые числа вместо цифрового шума в середину после запятой вставляет 5 нулей, типа: 0.8600000381 surprised

портянка принятая с ком порта, куда девается минус?  wacko :




по сумме происходящего маразм и шок
Прикрепления: 9419023.jpg(13Kb)


Сообщение отредактировал SirYorik - Вторник, 23.02.2016, 09:51
 
rw6cm Дата: Вторник, 23.02.2016, 10:05 | Сообщение # 2
Генерал-майор
Группа: Проверенные
Сообщений: 473
Награды: 43
Репутация: 31
Статус: Offline
Цитата SirYorik ()
по сумме происходящего маразм и шок
Считать на ардуине Float с 6ти значным числом вобще маразм :)))
В флпрог стараюсь за тысячные не выходить )


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)
 
support Дата: Вторник, 23.02.2016, 10:07 | Сообщение # 3
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Ардуино вообще не очень дружит с типом Float. Поэтому я всегда рекомендую всю математику делать с целыми значениями, а если нужно вывести флоат, переводим перед самым выводом например на дисплей или в порт.

Разработчик программы FLProg
 
SirYorik Дата: Вторник, 23.02.2016, 10:29 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
Цитата rw6cm ()
В флпрог стараюсь за тысячные не выходить )
да мне и 2х хватило бы, оно этот хлам само откудато натягивает, как отпилить не знаю.
в выводе задрал на 10 знаков чтобы посмотреть чего происходит.

Цитата support ()
а если нужно вывести флоат, переводим перед самым выводом например на дисплей или в порт.
вывод только для диагностики глюка с математикой.

при этом рядом, прям на одной плате другая пара float переменных нормально вычитается, со значениями <0 всё окей.

пробовал тип double - не помогло.(что логично)
пробовал сложение с отрицательным числом, не помогло.

1.3092288970+-1.1000000238 = 0.2092288732
1.3098659515+-1.1000000238 = 0.2098659276
0.9984392166+-1.1000000238 = 0.1015608310
0.8943552970+-1.1000000238 = 0.2056447267
0.8057197570+-1.1000000238 = 0.2942802429

cranky

Добавлено (23.02.2016, 10:29)
---------------------------------------------
переточил что бы вычитание было целочисленным

схематично: F*100-->INT-INT-->INT/100.0-->F

0.11728 - 1.10000 = 0.98999
0.11055 - 1.10000 = 0.98999
0.10449 - 1.10000 = -1.00000
0.09904 - 1.10000 = -1.00999

Сообщение отредактировал SirYorik - Вторник, 23.02.2016, 10:19
 
rw6cm Дата: Вторник, 23.02.2016, 10:52 | Сообщение # 5
Генерал-майор
Группа: Проверенные
Сообщений: 473
Награды: 43
Репутация: 31
Статус: Offline
Цитата SirYorik ()
да мне и 2х хватило бы
Даже с тысячными проблем не замечалось, если конечно не применялось преобразований.
Прикрепления: 1_1-1.flp(87Kb)


PC, E8400, 3.5Gb, Win7-32, ver.FLP(portable)

Сообщение отредактировал rw6cm - Вторник, 23.02.2016, 10:52
 
SirYorik Дата: Вторник, 23.02.2016, 11:01 | Сообщение # 6
Лейтенант
Группа: Проверенные
Сообщений: 119
Награды: 2
Репутация: 0
Статус: Offline
плюнул на неведому-фигню, 4 часа в никуда.

переделал эти переменные в integer и умножил на 1000, всё немедленно стало как надо
1187 - 1100 = 87
1195 - 1100 = 95
1198 - 1100 = 98
970 - 1100 = -130
874 - 1100 = -226
787 - 1100 = -313

ДИЧЬ!
 
support Дата: Вторник, 23.02.2016, 11:16 | Сообщение # 7
Автор программы
Группа: Администраторы
Сообщений: 579
Награды: 30
Репутация: 21
Статус: Offline
Цитата SirYorik ()
переделал эти переменные в integer и умножил на 1000, всё немедленно стало как надо
 Всё правильно сделали. Даже сами разработчики ардуино так рекомендуют делать. Кстати есть ещё приколы. Например:

Цитата
Следует иметь ввиду, что числа с плавающей точкой не являются точными, что может приводить к неожиданным результатам при их сравнении.
Например, 6.0 / 3.0 может не равняться 2.0. Поэтому, вместо сравнения
двух чисел следует проверять, является ли абсолютное значение их
разности меньше некоторого небольшого значения.


Разработчик программы FLProg
 
Форум » Основной » Спросить у знатоков » вычитание float из float = ересь (выморозило)
Страница 1 из 11
Поиск:

FLProg © 2016
Яндекс.Метрика