Столкнулся с непонятным багом.
Задача: контролировать вводимые данные так, чтобы min<max всегда. Если что, корректировать данные.
Три столбца контролов.
код контроля выглядит так:
т.е.. если новое значение min-ма превысило текущее max-ма, то max задаю на 0,1 больше, чем min,
У полей ввода есть ограничения (настройки на видео показаны)
Левый и правый столбцы ведут себя прилично, а вот средний глючит: не хочет обновляться у потолка.
Весь проект большой, поэтому код не прилагаю.
Вот ролик (встроить его не смог)
Подозреваю, что в число закрался мелкий хвост, который прячется округлением, но
- как его убрать
- почему он появился только тут, и не проявляется на соседних полях? (актуальнее: как этого избежать в будущем?)
значение numeric
-
Aleksey Feoktistov
- leader
- Сообщения: 898
- Зарегистрирован: 20 янв 2009, 00:15
- Награды: 6
- Версия LabVIEW: 2015
- Откуда: Tyumen
- Поблагодарили: 2 раза
- Контактная информация:
-
- professor
- Сообщения: 3403
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 172 раза
- Контактная информация:
Re: значение numeric
Не помогло
АВВыяснил что два равных числа отличаются на 4е-16
а машинный ноль = 2е-16 (первая и вторая пробы соответственно): так что даже сравнение по разности не помогает.
Чтобы не заморачиваться, сравниваю целые, умноженные на 10, тем более, что всё равно округлять надо.
АВВыяснил что два равных числа отличаются на 4е-16
а машинный ноль = 2е-16 (первая и вторая пробы соответственно): так что даже сравнение по разности не помогает.
Чтобы не заморачиваться, сравниваю целые, умноженные на 10, тем более, что всё равно округлять надо.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: значение numeric
Может, вот это поможет?
https://lavag.org/topic/18636-floating- ... ost-equal/
Есть ещё вот такое: https://lavag.org/topic/16733-floating- ... primitive/ , но пишут, что не рекомендуется этим пользоваться.
https://lavag.org/topic/18636-floating- ... ost-equal/
Есть ещё вот такое: https://lavag.org/topic/16733-floating- ... primitive/ , но пишут, что не рекомендуется этим пользоваться.
-
Aleksey Feoktistov
- leader
- Сообщения: 898
- Зарегистрирован: 20 янв 2009, 00:15
- Награды: 6
- Версия LabVIEW: 2015
- Откуда: Tyumen
- Поблагодарили: 2 раза
- Контактная информация:
Re: значение numeric
очень странно. как же Вы тогда сравниваете два целых числа?Artem.spb писал(а):Не помогло
все равно надо как-то корректно отбросить дробную часть.
а функция Round Toward -Infinity как раз это и делает.
можно после неё не делить 10 и использовать формат данных Integer
-
- professor
- Сообщения: 3403
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 172 раза
- Контактная информация:
Re: значение numeric
я в итоге целые и сравниваю.Aleksey Feoktistov писал(а):очень странно. как же Вы тогда сравниваете два целых числа?Artem.spb писал(а):Не помогло
код уже заменил, было что-то вроде этого Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.
Согласен, очень странно. Тем более, что в оба поля руками вбиваю 2,9, а перед этим пробовал в начало программы (сразу после запуска) вставить
[x*10]/10 для обрубания хвостов.
т.к. по ТЗ всё равно нужно округление до 0,1, то сейчас делаю так работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: значение numeric
Поставьте в свойствах контрола "Response to value outside limits" = "Ignore" вместо "Coerce", тогда стрелками можно будет достичь крайних положений, хотя порой и более мелкими приращениями.Artem.spb писал(а):работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.
Увеличьте число знаков после запятой, и сможете увидеть этот хвост Появление хвоста связано с представлением чисел с плавающей запятой в бинарном формате, а также с ошибкой округления таких чисел. Подробно написано здесь: http://info-labview.org/ILVMessages/199 ... 3_023.html И там же можно найти один из ворк-эраундов: поменять представление контрола на Single, а потом обратно на Double, это устранит лишний хвост. Но число всё равно никогда не будет точно равно 0.1 или 2.9, с этим ничего не поделать.Artem.spb писал(а):Подозреваю, что в число закрался мелкий хвост, который прячется округлением, но
- как его убрать
- почему он появился только тут, и не проявляется на соседних полях? (актуальнее: как этого избежать в будущем?)
Машинный ноль можно сделать поточнее: Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.Artem.spb писал(а):Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.
Последний раз редактировалось dadreamer 29 ноя 2021, 11:53, всего редактировалось 2 раза.
-
- professor
- Сообщения: 3403
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 172 раза
- Контактная информация:
Re: значение numeric
Не пойдёт. При игноре можно руками ввести значение вне диапазона, что больше недопустимо, чем невозможность стрелками дойти до границы.dadreamer писал(а):Поставьте в свойствах контрола "Response to value outside limits" = "Ignore" вместо "Coerce", тогда стрелками можно будет достичь крайних положений, хотя порой и более мелкими приращениями.Artem.spb писал(а):работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.
С теорией двоичного счисления знаком. Не понятно, почему два числа, вводимых одинаково, оказываются не равными. Если числа получены путём математических операций, то всё понятно, хвост может быть каким угодно, но при вводе-то почему то же самое.Увеличьте числов знаков после запятой, и сможете увидеть этот хвост Появление хвоста связано с представлением чисел с плавающей запятой в бинарном формате, а также с ошибкой округления таких чисел. Подробно написано здесь: http://hannahsmac.magnet.fsu.edu/lv/ilv ... 3_023.html И там же можно найти один из ворк-эраундов: поменять представление контрола на Single, а потом обратно на Double, это устранит лишний хвост. Но число всё равно никогда не будет точно равно 0.1 или 2.9, с этим ничего не поделать.Artem.spb писал(а):Подозреваю, что в число закрался мелкий хвост, который прячется округлением, но
- как его убрать
- почему он появился только тут, и не проявляется на соседних полях? (актуальнее: как этого избежать в будущем?)
сделал через инты. лучше не буду больше тратить время на эксперименты, на будущее возьму на заметку.Машинный ноль можно сделать поточнее: Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.Artem.spb писал(а):Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: значение numeric
Это да, но можно в эвенте отфильтровать значения вне диапазона.Artem.spb писал(а):Не пойдёт. При игноре можно руками ввести значение вне диапазона, что больше недопустимо, чем невозможность стрелками дойти до границы.
Не могу воспроизвести это явление. Оба числа получаются строго равными друг другу. Если будет время, скиньте с подобным поведением.Artem.spb писал(а):Не понятно, почему два числа, вводимых одинаково, оказываются не равными.