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

Сравнение REAL

Добавлено: 07 Апрель 2015, 16:30
PavelNK
Чудеса в решете. Стоп показывает, что значение переменной = 2.3, но при сравнении вылетает. Т.е. VarReal$ < 2.3

VarReal$ = 2.3
DO SetRtn

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

...

Сравнение REAL

Добавлено: 07 Апрель 2015, 16:58
Admin
А покажи в STOP так FORMAT(varReal$,@N10.5) !?
Какой то бред по похожей теме был...

Сравнение REAL

Добавлено: 07 Апрель 2015, 17:29
seawolf
Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005

Сравнение REAL

Добавлено: 07 Апрель 2015, 18:10
Дед Пахом
Real ваще нельзя сравнивать.

Сравнение REAL

Добавлено: 07 Апрель 2015, 19:10
seawolf
В обще случае следует конечно избегать сравнения real, но если идут скажем идут геодезические вычисления (тригонометрия), то приходиться делать это!

Сравнение REAL

Добавлено: 07 Апрель 2015, 20:10
Дед Пахом
почему не DECIMAL?

Сравнение REAL

Добавлено: 07 Апрель 2015, 21:49
seawolf
ну уж не помню почему - это было лет 15 назад

Сравнение REAL

Добавлено: 08 Апрель 2015, 8:24
PavelNK
Всем спасибо! Чтобы не заморачиваться воспользовался советом seawolf
seawolf писал(а):Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005

Сравнение REAL

Добавлено: 08 Апрель 2015, 9:13
Admin
Да я тупой. Все равно не понимаю.
Риторический вопрос: Если это не результат от деления то какого хрена?

Сравнение REAL

Добавлено: 08 Апрель 2015, 9:40
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
По-моему, всё ясно

Сравнение REAL

Добавлено: 08 Апрель 2015, 9:42
Yufil
Кстати...
Real надо сравнивать на разницу значения меньше некой дельты. Ну скажем (VarReal$ - 2.3) < 0.00005
Конечно, Abs(VarReal$-2.3) ...

Сравнение REAL

Добавлено: 08 Апрель 2015, 12:02
Алексей- Софт-Центр
Добрый день!

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


Алексей

Сравнение REAL

Добавлено: 08 Апрель 2015, 12:25
Admin
Т.е. четко 2.30000000 записать в REAL нет возможности?
Понятно. Запомним.

Сравнение REAL

Добавлено: 08 Апрель 2015, 14:52
kreator
Замените VarReal$ на LOC:VarReal и будет Вам счастье. И старайтесь не использовать Implicit Variables.

Сравнение REAL

Добавлено: 08 Апрель 2015, 17:32
finsoftrz
При сравнении real надо использовать round. То есть типа round(VarReal$ - 2.3,0.000001)=0. И все будет пучком :-)