Сравнение REAL

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Сравнение REAL

Сообщение PavelNK »

Чудеса в решете. Стоп показывает, что значение переменной = 2.3, но при сравнении вылетает. Т.е. VarReal$ < 2.3

VarReal$ = 2.3
DO SetRtn

SetRtn ROUTINE
stop(VarReal$)
if VarReal$ < 2.3 then exit.

...
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сравнение REAL

Сообщение Admin »

А покажи в STOP так FORMAT(varReal$,@N10.5) !?
Какой то бред по похожей теме был...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
seawolf
Старожил
Сообщения: 217
Зарегистрирован: 08 Июль 2005, 11:23
Откуда: St. Petersburg

Сравнение REAL

Сообщение seawolf »

Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сравнение REAL

Сообщение Дед Пахом »

Real ваще нельзя сравнивать.
С уважением, ДП
seawolf
Старожил
Сообщения: 217
Зарегистрирован: 08 Июль 2005, 11:23
Откуда: St. Petersburg

Сравнение REAL

Сообщение seawolf »

В обще случае следует конечно избегать сравнения real, но если идут скажем идут геодезические вычисления (тригонометрия), то приходиться делать это!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Сравнение REAL

Сообщение Дед Пахом »

почему не DECIMAL?
С уважением, ДП
seawolf
Старожил
Сообщения: 217
Зарегистрирован: 08 Июль 2005, 11:23
Откуда: St. Petersburg

Сравнение REAL

Сообщение seawolf »

ну уж не помню почему - это было лет 15 назад
PavelNK
Старожил
Сообщения: 279
Зарегистрирован: 15 Март 2011, 8:02

Сравнение REAL

Сообщение PavelNK »

Всем спасибо! Чтобы не заморачиваться воспользовался советом seawolf
seawolf писал(а):Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сравнение REAL

Сообщение Admin »

Да я тупой. Все равно не понимаю.
Риторический вопрос: Если это не результат от деления то какого хрена?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сравнение REAL

Сообщение Yufil »

Поскольку в компьютерах используется двоичная форма представления данных, число 2.3 будет выражено в виде периодической двоичной дроби, строго говоря, бесконечной длины. 8-байтное плавающее на x86 даёт возможность 52 двоичных (15-16 десятичных) знака. Таким образом, число может слегка отличаться от правильного значения, начиная с 15 знака.

Я запустил интерпретатор Python (там такие же плавающие) и вычислил

>> print(2.3 - 2)
>>0.299999999999999998

>>(2.3-2) == 0.3
>>false

>> print(2.3-2-0.3)
>> -1.6653345369377348e-16
По-моему, всё ясно
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сравнение REAL

Сообщение Yufil »

Кстати...
Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005
Конечно, Abs(VarReal$-2.3) ...
Алексей- Софт-Центр
Ветеран
Сообщения: 390
Зарегистрирован: 26 Август 2009, 12:41
Откуда: Moscow
Контактная информация:

Сравнение REAL

Сообщение Алексей- Софт-Центр »

Добрый день!

Ну, да. Плавающая точка никогда не хранила и не хранит целых значений.
Кстати: про это надо помнить, когда у Вас объявлено поле real в базе.
И вдруг вылетает лихое сообщение, типа:
"Запись была изменена другой станцией"
хотя никто больше с базой не работает.


Алексей
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сравнение REAL

Сообщение Admin »

Т.е. четко 2.30000000 записать в REAL нет возможности?
Понятно. Запомним.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Сравнение REAL

Сообщение kreator »

Замените VarReal$ на LOC:VarReal и будет Вам счастье. И старайтесь не использовать Implicit Variables.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5239
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 12 раз
Поблагодарили: 65 раз

Сравнение REAL

Сообщение finsoftrz »

При сравнении real надо использовать round. То есть типа round(VarReal$ - 2.3,0.000001)=0. И все будет пучком :-)
C6/C12, ШВС, tps/btrieve.
Ответить