Сравнение REAL
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Сравнение REAL
Чудеса в решете. Стоп показывает, что значение переменной = 2.3, но при сравнении вылетает. Т.е. VarReal$ < 2.3
VarReal$ = 2.3
DO SetRtn
SetRtn ROUTINE
stop(VarReal$)
if VarReal$ < 2.3 then exit.
...
VarReal$ = 2.3
DO SetRtn
SetRtn ROUTINE
stop(VarReal$)
if VarReal$ < 2.3 then exit.
...
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Сравнение REAL
А покажи в STOP так FORMAT(varReal$,@N10.5) !?
Какой то бред по похожей теме был...
Какой то бред по похожей теме был...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Сравнение REAL
Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005
Сравнение REAL
В обще случае следует конечно избегать сравнения real, но если идут скажем идут геодезические вычисления (тригонометрия), то приходиться делать это!
Сравнение REAL
Всем спасибо! Чтобы не заморачиваться воспользовался советом seawolf
seawolf писал(а):Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Сравнение REAL
Да я тупой. Все равно не понимаю.
Риторический вопрос: Если это не результат от деления то какого хрена?
Риторический вопрос: Если это не результат от деления то какого хрена?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Сравнение REAL
Поскольку в компьютерах используется двоичная форма представления данных, число 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
По-моему, всё ясно
Я запустил интерпретатор Python (там такие же плавающие) и вычислил
>> print(2.3 - 2)
>>0.299999999999999998
>>(2.3-2) == 0.3
>>false
>> print(2.3-2-0.3)
>> -1.6653345369377348e-16
По-моему, всё ясно
Сравнение REAL
Кстати...
Конечно, Abs(VarReal$-2.3) ...Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005
-
- Ветеран
- Сообщения: 390
- Зарегистрирован: 26 Август 2009, 12:41
- Откуда: Moscow
- Контактная информация:
Сравнение REAL
Добрый день!
Ну, да. Плавающая точка никогда не хранила и не хранит целых значений.
Кстати: про это надо помнить, когда у Вас объявлено поле real в базе.
И вдруг вылетает лихое сообщение, типа:
"Запись была изменена другой станцией"
хотя никто больше с базой не работает.
Алексей
Ну, да. Плавающая точка никогда не хранила и не хранит целых значений.
Кстати: про это надо помнить, когда у Вас объявлено поле real в базе.
И вдруг вылетает лихое сообщение, типа:
"Запись была изменена другой станцией"
хотя никто больше с базой не работает.
Алексей
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Сравнение REAL
Т.е. четко 2.30000000 записать в REAL нет возможности?
Понятно. Запомним.
Понятно. Запомним.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Сравнение REAL
Замените VarReal$ на LOC:VarReal и будет Вам счастье. И старайтесь не использовать Implicit Variables.
We are hard at work… for you. 

- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5238
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 12 раз
- Поблагодарили: 65 раз
Сравнение REAL
При сравнении real надо использовать round. То есть типа round(VarReal$ - 2.3,0.000001)=0. И все будет пучком 

C6/C12, ШВС, tps/btrieve.