Страница 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 нет возможности?
Понятно. Запомним.
Это же азбучная истина. Её студентам на первых уроках программирования впаривают
Если уж очень надо, то сравнить можно разницу между двумя с нормативным числом с заданной точностью
Сравнение 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
Результат:
Сравнение 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
Сравнение 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 такие переменные во всей огромной процедуре могут быть задействованы. С чем и борюсь по мере сил.