Страница 1 из 1

значение numeric

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

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

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

Re: значение numeric

Добавлено: 01 ноя 2015, 22:35
Aleksey Feoktistov
версия 2014
14.png

Re: значение numeric

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

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

Re: значение numeric

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

Re: значение numeric

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

Re: значение numeric

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

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

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

Re: значение numeric

Добавлено: 03 ноя 2015, 19:23
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
Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.

Re: значение numeric

Добавлено: 03 ноя 2015, 21:03
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
Этого, я думаю, должно вам хватить, чтобы распознать ошибку округления.
сделал через инты. лучше не буду больше тратить время на эксперименты, на будущее возьму на заметку.

Re: значение numeric

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