Сравнение REAL

Clarion, Clarion 7

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

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

Сравнение REAL

Сообщение Shur »

К слову.
И старайтесь не использовать Implicit Variables.
Kreator, если это сказано в общем, то это вредный совет. В Кларионе, где настройка программы происходит через написание имбедов, этот механизм весьма удобен.
При сравнении real надо использовать round. То есть типа round(VarReal$ - 2.3,0.000001)=0.
К сожалению, это не всегда поможет.
Значениями real могут быть как маленькие величины, так и числа большого порядка. Показываю на примере (уж простите, на SQL):

Код: Выделить всё

declare @f1 float, @f2 float
set @f1 = 12345678901234567
set @f2 = 12345678901234569
if @f1 = @f2
   print 'equals'
else
   print 'not equals' 
В результате выводится 'equals'. И round здесь тогда нужен такой (в терминах Клариона) - round(, 10)
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Сравнение REAL

Сообщение kreator »

Shur писал(а):К слову.

И старайтесь не использовать Implicit Variables.


Kreator, если это сказано в общем, то это вредный совет. В Кларионе, где настройка программы происходит через написание имбедов, этот механизм весьма удобен.
Согласен, удобен, особенно когда привык. Я тоже всегда использовал. Но в последнее время стараюсь отказываться. Почему? Во-первых, всем известные проблемы (например, на этапе компилирования ошибок нет, действует только в рамках процедуры, что для программирующих в ABC неприемлемо ...). Во- вторых, сами программисты SV как правило не используют, приведу тест первого попавшего класса:

Код: Выделить всё

EnhancedFocusClassType.EnableControlType        PROCEDURE(USHORT pControlType)
lIndex       UNSIGNED,AUTO
  CODE
  LOOP lIndex = 1 TO RECORDS(SELF.ExcludedControlType)
      GET(SELF.ExcludedControlType,lIndex)
      IF SELF.ExcludedControlType.CT = pControlType THEN
         DELETE(SELF.ExcludedControlType)
         BREAK
      END
  END

EnhancedFocusClassType.ControlAllowed        PROCEDURE(UNSIGNED pControl)
lControlType   USHORT,AUTO
lIndex         UNSIGNED,AUTO
  CODE
  IF NOT pControl THEN RETURN False.
  IF pControl{PROP:InToolbar}   THEN RETURN False.
  IF NOT pControl{PROP:Visible} THEN RETURN False.

  IF RECORDS(SELF.ExcludedControlType) = 0 THEN RETURN True.

  lControlType = pControl{PROP:Type}
  LOOP lIndex = 1 TO RECORDS(SELF.ExcludedControlType)
     GET (SELF.ExcludedControlType,lIndex)
     IF SELF.ExcludedControlType.CT = lControlType THEN RETURN False.
  END
  RETURN True

Казалось бы, циклы, для таких переменных самое то.
В-третьих, в хелпе есть предостережения насчёт таких переменных, например:

Код: Выделить всё

Implicit variables used only within the ROUTINE are less efficient than using local variables. 
We are hard at work… for you. :)
Аватара пользователя
Губин Игорь
Шубуршун
Сообщения: 2584
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 26 раз

Сравнение REAL

Сообщение Губин Игорь »

Admin писал(а): Т.е. четко 2.30000000 записать в REAL нет возможности?
Понятно. Запомним.
Это же азбучная истина. Её студентам на первых уроках программирования впаривают :idied:
Если уж очень надо, то сравнить можно разницу между двумя с нормативным числом с заданной точностью
Это я только кажусь дураком! На самом деле я полный идиот!
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Сравнение REAL

Сообщение kreator »

Дико извиняюсь ещё раз, но результат как у PavelNK получить не удаётся.

Код: Выделить всё

LOC:RealValue = 2.3
if LOC:RealValue<>2.3
  stop('Не равно!!!  ' & LOC:RealValue & '  ' & format(LOC:RealValue,@n20.15))
else 
  stop('Равно!!!  ' & LOC:RealValue & '  ' & format(LOC:RealValue,@n20.15))
end  
Результат:
1.jpg
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сравнение REAL

Сообщение Admin »

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

Сравнение REAL

Сообщение kreator »

Admin писал(а):RTFM: Implicit Variables
Думаете с Implicit Variables по-другому? Всё так-же. Clarion присваивает значение "2.3" жёстко.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сравнение REAL

Сообщение Admin »

2015-04-14 09-03-47 Stop.png
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Губин Игорь
Шубуршун
Сообщения: 2584
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Благодарил (а): 3 раза
Поблагодарили: 26 раз

Сравнение REAL

Сообщение Губин Игорь »

Это проявляется не столь часто. У меня есть всего один кусок, где я наткнулся на несовпадение.
Это я только кажусь дураком! На самом деле я полный идиот!
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Сравнение REAL

Сообщение kreator »

Admin писал(а):2015-04-14 09-03-47 Stop.png
Не корректный текст. Присваиваете LOC:RealValue$, а сравниваете LOC:RealValue". Результат естественный - LOC:RealValue"='' (пусто, null).
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сравнение REAL

Сообщение Admin »

kreator писал(а): Не корректный текст
Лоханулся :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сравнение REAL

Сообщение Yufil »

Попробуйте сравнить 2.3 c (2+0.3), будете неприятно удивлены. Собственно, о чём я и писал ранее. Если 2.3 получается в результате любого вычисления (например, константа 2.3 может для Клариона являться числом типа Decimal, что вполне уместно для коммерческого языка), то дефекты округления вполне возможны
kreator
✯ Ветеран ✯
Сообщения: 5160
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Сравнение REAL

Сообщение kreator »

Admin писал(а):Лоханулся :)
Я и говорю - одни проблемы от таких переменных. А представляете в Legacy такие переменные во всей огромной процедуре могут быть задействованы. С чем и борюсь по мере сил.
We are hard at work… for you. :)
Ответить