значение numeric

Обсуждение, связанное с разработкой ПО верхнего уровня
Ответить
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

значение numeric

Сообщение Artem.spb »

Столкнулся с непонятным багом.
Задача: контролировать вводимые данные так, чтобы min<max всегда. Если что, корректировать данные.
Три столбца контролов.
код контроля выглядит так:
upd_val.png
т.е.. если новое значение min-ма превысило текущее max-ма, то max задаю на 0,1 больше, чем min,

У полей ввода есть ограничения (настройки на видео показаны)
Левый и правый столбцы ведут себя прилично, а вот средний глючит: не хочет обновляться у потолка.
Весь проект большой, поэтому код не прилагаю.
Вот ролик (встроить его не смог)

Подозреваю, что в число закрался мелкий хвост, который прячется округлением, но
- как его убрать
- почему он появился только тут, и не проявляется на соседних полях? (актуальнее: как этого избежать в будущем?)
Аватара пользователя
Aleksey Feoktistov

Activity Gold Silver Black
leader
leader
Сообщения: 898
Зарегистрирован: 20 янв 2009, 00:15
Награды: 6
Версия LabVIEW: 2015
Откуда: Tyumen
Поблагодарили: 2 раза
Контактная информация:

Re: значение numeric

Сообщение Aleksey Feoktistov »

версия 2014
14.png
Вложения
14.vi
(8.6 КБ) 193 скачивания
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: значение numeric

Сообщение Artem.spb »

Не помогло
АВВыяснил что два равных числа отличаются на 4е-16
а машинный ноль = 2е-16 (первая и вторая пробы соответственно):
probe.png
так что даже сравнение по разности не помогает.

Чтобы не заморачиваться, сравниваю целые, умноженные на 10, тем более, что всё равно округлять надо.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: значение numeric

Сообщение dadreamer »

Может, вот это поможет?
https://lavag.org/topic/18636-floating- ... ost-equal/
Есть ещё вот такое: https://lavag.org/topic/16733-floating- ... primitive/ , но пишут, что не рекомендуется этим пользоваться.
Аватара пользователя
Aleksey Feoktistov

Activity Gold Silver Black
leader
leader
Сообщения: 898
Зарегистрирован: 20 янв 2009, 00:15
Награды: 6
Версия LabVIEW: 2015
Откуда: Tyumen
Поблагодарили: 2 раза
Контактная информация:

Re: значение numeric

Сообщение Aleksey Feoktistov »

Artem.spb писал(а):Не помогло
очень странно. как же Вы тогда сравниваете два целых числа?
все равно надо как-то корректно отбросить дробную часть.
а функция Round Toward -Infinity как раз это и делает.
можно после неё не делить 10 и использовать формат данных Integer
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: значение numeric

Сообщение Artem.spb »

Aleksey Feoktistov писал(а):
Artem.spb писал(а):Не помогло
очень странно. как же Вы тогда сравниваете два целых числа?
я в итоге целые и сравниваю.

код уже заменил, было что-то вроде этого
less.png
less.png (13.2 КБ) 8075 просмотров
Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.
Согласен, очень странно. Тем более, что в оба поля руками вбиваю 2,9, а перед этим пробовал в начало программы (сразу после запуска) вставить
[x*10]/10 для обрубания хвостов.

т.к. по ТЗ всё равно нужно округление до 0,1, то сейчас делаю так
compare.png
работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: значение numeric

Сообщение dadreamer »

Artem.spb писал(а):работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.
Поставьте в свойствах контрола "Response to value outside limits" = "Ignore" вместо "Coerce", тогда стрелками можно будет достичь крайних положений, хотя порой и более мелкими приращениями.
Artem.spb писал(а):Подозреваю, что в число закрался мелкий хвост, который прячется округлением, но
- как его убрать
- почему он появился только тут, и не проявляется на соседних полях? (актуальнее: как этого избежать в будущем?)
Увеличьте число знаков после запятой, и сможете увидеть этот хвост :wink:
2015-11-03_21-14-20.jpg
Появление хвоста связано с представлением чисел с плавающей запятой в бинарном формате, а также с ошибкой округления таких чисел. Подробно написано здесь: http://info-labview.org/ILVMessages/199 ... 3_023.html И там же можно найти один из ворк-эраундов: поменять представление контрола на Single, а потом обратно на Double, это устранит лишний хвост. Но число всё равно никогда не будет точно равно 0.1 или 2.9, с этим ничего не поделать.
Artem.spb писал(а):Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.
Машинный ноль можно сделать поточнее:
2015-11-03_21-21-35.jpg
Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.
Последний раз редактировалось dadreamer 29 ноя 2021, 11:53, всего редактировалось 2 раза.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3393
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: значение numeric

Сообщение Artem.spb »

dadreamer писал(а):
Artem.spb писал(а):работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.
Поставьте в свойствах контрола "Response to value outside limits" = "Ignore" вместо "Coerce", тогда стрелками можно будет достичь крайних положений, хотя порой и более мелкими приращениями.
Не пойдёт. При игноре можно руками ввести значение вне диапазона, что больше недопустимо, чем невозможность стрелками дойти до границы.

Artem.spb писал(а):Подозреваю, что в число закрался мелкий хвост, который прячется округлением, но
- как его убрать
- почему он появился только тут, и не проявляется на соседних полях? (актуальнее: как этого избежать в будущем?)
Увеличьте числов знаков после запятой, и сможете увидеть этот хвост :wink:
2015-11-03_21-14-20.jpg
Появление хвоста связано с представлением чисел с плавающей запятой в бинарном формате, а также с ошибкой округления таких чисел. Подробно написано здесь: http://hannahsmac.magnet.fsu.edu/lv/ilv ... 3_023.html И там же можно найти один из ворк-эраундов: поменять представление контрола на Single, а потом обратно на Double, это устранит лишний хвост. Но число всё равно никогда не будет точно равно 0.1 или 2.9, с этим ничего не поделать.
С теорией двоичного счисления знаком. Не понятно, почему два числа, вводимых одинаково, оказываются не равными. Если числа получены путём математических операций, то всё понятно, хвост может быть каким угодно, но при вводе-то почему то же самое.
Artem.spb писал(а):Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.
Машинный ноль можно сделать поточнее:
2015-11-03_21-21-35.jpg
Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.
сделал через инты. лучше не буду больше тратить время на эксперименты, на будущее возьму на заметку.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: значение numeric

Сообщение dadreamer »

Artem.spb писал(а):Не пойдёт. При игноре можно руками ввести значение вне диапазона, что больше недопустимо, чем невозможность стрелками дойти до границы.
Это да, но можно в эвенте отфильтровать значения вне диапазона.
Artem.spb писал(а):Не понятно, почему два числа, вводимых одинаково, оказываются не равными.
Не могу воспроизвести это явление. Оба числа получаются строго равными друг другу. Если будет время, скиньте :vi: с подобным поведением.
Ответить

Вернуться в «Лицевая панель»