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

Сравнение REAL

Добавлено: 10 Апрель 2015, 12:43
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)

Сравнение REAL

Добавлено: 10 Апрель 2015, 13:10
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. 

Сравнение REAL

Добавлено: 10 Апрель 2015, 15:26
Губин Игорь
Admin писал(а): Т.е. четко 2.30000000 записать в REAL нет возможности?
Понятно. Запомним.
Это же азбучная истина. Её студентам на первых уроках программирования впаривают :idied:
Если уж очень надо, то сравнить можно разницу между двумя с нормативным числом с заданной точностью

Сравнение REAL

Добавлено: 11 Апрель 2015, 16:29
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

Сравнение REAL

Добавлено: 11 Апрель 2015, 17:32
Admin
kreator писал(а): результат как у PavelNK получить не удаётся
RTFM: Implicit Variables

Сравнение REAL

Добавлено: 13 Апрель 2015, 21:26
kreator
Admin писал(а):RTFM: Implicit Variables
Думаете с Implicit Variables по-другому? Всё так-же. Clarion присваивает значение "2.3" жёстко.

Сравнение REAL

Добавлено: 14 Апрель 2015, 2:04
Admin
2015-04-14 09-03-47 Stop.png

Сравнение REAL

Добавлено: 14 Апрель 2015, 8:17
Губин Игорь
Это проявляется не столь часто. У меня есть всего один кусок, где я наткнулся на несовпадение.

Сравнение REAL

Добавлено: 14 Апрель 2015, 10:23
kreator
Admin писал(а):2015-04-14 09-03-47 Stop.png
Не корректный текст. Присваиваете LOC:RealValue$, а сравниваете LOC:RealValue". Результат естественный - LOC:RealValue"='' (пусто, null).

Сравнение REAL

Добавлено: 14 Апрель 2015, 10:43
Admin
kreator писал(а): Не корректный текст
Лоханулся :)

Сравнение REAL

Добавлено: 14 Апрель 2015, 11:21
Yufil
Попробуйте сравнить 2.3 c (2+0.3), будете неприятно удивлены. Собственно, о чём я и писал ранее. Если 2.3 получается в результате любого вычисления (например, константа 2.3 может для Клариона являться числом типа Decimal, что вполне уместно для коммерческого языка), то дефекты округления вполне возможны

Сравнение REAL

Добавлено: 14 Апрель 2015, 11:53
kreator
Admin писал(а):Лоханулся :)
Я и говорю - одни проблемы от таких переменных. А представляете в Legacy такие переменные во всей огромной процедуре могут быть задействованы. С чем и борюсь по мере сил.