значение numeric

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

значение numeric

Postby Artem.spb on 01 Nov 2015, 22:17

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

т.е.. если новое значение min-ма превысило текущее max-ма, то max задаю на 0,1 больше, чем min,

У полей ввода есть ограничения (настройки на видео показаны)
Левый и правый столбцы ведут себя прилично, а вот средний глючит: не хочет обновляться у потолка.
Весь проект большой, поэтому код не прилагаю.
Вот ролик (встроить его не смог)
https://youtu.be/eTs4KX4A5Es
Подозреваю, что в число закрался мелкий хвост, который прячется округлением, но
- как его убрать
- почему он появился только тут, и не проявляется на соседних полях? (актуальнее: как этого избежать в будущем?)
Artem.spb
expert
expert
 
Posts: 1295
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 224
CLD hardware I/O VIP freelance

Re: значение numeric

Postby Aleksey Feoktistov on 01 Nov 2015, 22:35

версия 2014
14.png
Attachments
14.vi
(8.6 KiB) Downloaded 83 times
User avatar
Aleksey Feoktistov
leader
leader
 
Posts: 897
Joined: 20 Jan 2009, 00:15
Location: Tyumen
Medals: 6
Activity (2) Gold (1) Silver (1) Black (2)
LabVIEW Version: 2015
Karma: 82
VIP students

Re: значение numeric

Postby Artem.spb on 02 Nov 2015, 20:10

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


так что даже сравнение по разности не помогает.

Чтобы не заморачиваться, сравниваю целые, умноженные на 10, тем более, что всё равно округлять надо.
Artem.spb
expert
expert
 
Posts: 1295
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 224
CLD hardware I/O VIP freelance

Re: значение numeric

Postby dadreamer on 02 Nov 2015, 20:24

Может, вот это поможет?
https://lavag.org/topic/18636-floating- ... ost-equal/
Есть ещё вот такое: https://lavag.org/topic/16733-floating- ... primitive/ , но пишут, что не рекомендуется этим пользоваться.
User avatar
dadreamer
professor
professor
 
Posts: 3043
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 750
I/O VIP vision internet

Re: значение numeric

Postby Aleksey Feoktistov on 03 Nov 2015, 08:04

Artem.spb wrote:Не помогло


очень странно. как же Вы тогда сравниваете два целых числа?
все равно надо как-то корректно отбросить дробную часть.
а функция Round Toward -Infinity как раз это и делает.
можно после неё не делить 10 и использовать формат данных Integer
User avatar
Aleksey Feoktistov
leader
leader
 
Posts: 897
Joined: 20 Jan 2009, 00:15
Location: Tyumen
Medals: 6
Activity (2) Gold (1) Silver (1) Black (2)
LabVIEW Version: 2015
Karma: 82
VIP students

Re: значение numeric

Postby Artem.spb on 03 Nov 2015, 17:58

Aleksey Feoktistov wrote:
Artem.spb wrote:Не помогло


очень странно. как же Вы тогда сравниваете два целых числа?

я в итоге целые и сравниваю.

код уже заменил, было что-то вроде этого
less.png
less.png (13.2 KiB) Viewed 3983 times

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

т.к. по ТЗ всё равно нужно округление до 0,1, то сейчас делаю так
compare.png

работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.
Artem.spb
expert
expert
 
Posts: 1295
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 224
CLD hardware I/O VIP freelance

Re: значение numeric

Postby dadreamer on 03 Nov 2015, 19:23

Artem.spb wrote:работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.

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

Увеличьте числов знаков после запятой, и сможете увидеть этот хвост :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 wrote:Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.

Машинный ноль можно сделать поточнее:
2015-11-03_21-21-35.jpg

Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.
User avatar
dadreamer
professor
professor
 
Posts: 3043
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 750
I/O VIP vision internet

Re: значение numeric

Postby Artem.spb on 03 Nov 2015, 21:03

dadreamer wrote:
Artem.spb wrote:работает, хотя граничные значения нельзя вбить стрелками, только руками. С этим так и не разобрался.

Поставьте в свойствах контрола "Response to value outside limits" = "Ignore" вместо "Coerce", тогда стрелками можно будет достичь крайних положений, хотя порой и более мелкими приращениями.

Не пойдёт. При игноре можно руками ввести значение вне диапазона, что больше недопустимо, чем невозможность стрелками дойти до границы.


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

Увеличьте числов знаков после запятой, и сможете увидеть этот хвост :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 wrote:Верхнее сравнение - обычное, а нижнее для проверки, что числа не оказались равными в пределах машинного нуля.
при вводе, например, 2,9 в оба поля, получал, что числа отличаются на 4е-16. естественно, сравнение с "нулём" не в пользу нуля.

Машинный ноль можно сделать поточнее:
2015-11-03_21-21-35.jpg

Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.

сделал через инты. лучше не буду больше тратить время на эксперименты, на будущее возьму на заметку.
Artem.spb
expert
expert
 
Posts: 1295
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 224
CLD hardware I/O VIP freelance

Re: значение numeric

Postby dadreamer on 03 Nov 2015, 21:47

Artem.spb wrote:Не пойдёт. При игноре можно руками ввести значение вне диапазона, что больше недопустимо, чем невозможность стрелками дойти до границы.

Это да, но можно в эвенте отфильтровать значения вне диапазона.
Artem.spb wrote:Не понятно, почему два числа, вводимых одинаково, оказываются не равными.

Не могу воспроизвести это явление. Оба числа получаются строго равными друг другу. Если будет время, скиньте :vi: с подобным поведением.
User avatar
dadreamer
professor
professor
 
Posts: 3043
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 750
I/O VIP vision internet


Return to Лицевая панель

Who is online

Users browsing this forum: No registered users and 3 guests

cron