Тема: Оператор "=" для вещественных чисел

Всем доброго времени суток!

Сразу хочу подчеркнуть, что у меня нет большого опыта создания программ на AutoLisp.
Поэтому я обращаюсь за помощью к специалистам в этой области.

Документация по AutoLisp гласит:

Функция =
Проверяет равенство аргументов (рекомендуется использовать для чисел или строк).
(= <аргумент1> [<аргумент2> ... [<аргументN>]...])
Типы аргументов: любые.
Тип возвращаемого значения: логическое (т, если значения аргументов совпали, и nil, если не совпали).
Если задан только один аргумент, то возвращается т. Если количество аргументов 2 или больше, то при совпадении значений всех аргументов возвращается т, в противном случае — nil. При сравнении строк т выдается только в случае, когда длины всех строк равны и все строки посимвольно совпадают. При сравнении чисел т выдается также в том случае, когда один аргументы целые, а другие вещественные, но их значения совпадают.

Но есть примечание:
Внимание!
Следует иметь в виду, что значение, отображенное в командной строке, может не совпасть с реальным значением выражения. Вызвано это тем, что по умолчанию в вещественных числах система AutoCAD показывает в командной строке не более шести значащих цифр. Например, если бы в итоге вычисления должен был бы получиться результат 329.65142, то все равно вы бы увидели в командной строке только 329.651. Однако внутри программы AutoCAD оперирует числами с максимальной точностью (15 знаков после десятичной точки).

При создании кода на AutoLisp я столкнулся со странной, для меня, ситуацией:
фрагмент кода

(setq resultRealVal (* 2.12 3.13))
(setq resl (= resultRealVal 6.6356))

возвращает T, т.е. resl = T, так и должно быть,  а вот следующие фрагменты

(setq resultRealVal (* 2.12 3.13 4.14))
(setq resl (= resultRealVal 27.471384))

и

(setq resultRealVal (* 2.12 3.13 4.14 5.15 6.16 7.17 8.18 9.19))
(setq resl (= resultRealVal 469738.818961468588204))

возвращают nil.

Подскажите, пожалуйста, почему я получаю такой результата? В чем особенность применения оператора "=" для вещественных чисел?

Заранее благодарю за помощь.

С уважением,
Андрей

Re: Оператор "=" для вещественных чисел

Используй функцию equal с допуском,
напр.:

(setq a 0.0012346
          b 0.0012356)
(if (equal a b 0.00001);|допуск = 0.00001|:
(alert "равно")
(alert "не равно")
)

Писал без автокада но как-то так...

Re: Оператор "=" для вещественных чисел

Олег, день добрый!
Спасибо, что откликнулись на мой вопрос.

Я немного поэкспериментировал и вот, что получилось:

Вариант 1:
(setq resl (= (* 2.12 3.13 4.14 5.15 6.16 7.17 8.18 9.19) (* 2.12 3.13 4.14 5.15 6.16 7.17 8.18 9.19))) – возвращает t;

Вариант 2:
(setq resultRealVal (* 2.12 3.13 4.14 5.15 6.16 7.17 8.18 9.19))
(setq resl (equal resultRealVal   469738.818961468588204   0.000000001)) – возвращает t;

Вариант 3:
(setq resultRealVal (* 2.12 3.13 4.14 5.15 6.16 7.17 8.18 9.19))
(setq resl (= (rtos resultRealVal) (rtos 469738.818961468588204))) – возвращает t.

Вариант 4:
(setq resultRealVal (* 2.12 3.13 4.14 5.15 6.16 7.17 8.18 9.19))
(setq resl (= resultRealVal 469738.818961468588204)) – возвращает nil.

Олег, ваше предложение работает, еще раз большое спасибо.
Думаю, проблема возникла из-за реализации функции ‘setq’.

С уважением,
Андрей

Re: Оператор "=" для вещественных чисел

Думаю, проблема возникла из-за реализации функции ‘setq’.

Правильно думаешь :)