Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему неправильно выполняется equal?

Почему неправильно выполняется equal?

Ответ
Поиск в этой теме
Непрочитано 11.01.2017, 12:56 #1
Почему неправильно выполняется equal?
Кулик Алексей aka kpblc
Moderator
 
LISP, C# (ACAD 200[9,12,13,14])
 
С.-Петербург
Регистрация: 25.08.2003
Сообщений: 39,787

Обнаружил забавный момент:
Код:
[Выделить все]
 _1_$ (equal 1. 1.1 0.1)
nil
_1_$ (equal 6. 6.1 0.1)
T
Не удержался, написал элементарный код:
Код:
[Выделить все]
 (defun test (/ _c res)
  (setq _c -100.)
  (repeat 200
    (if (not (equal _c (+ _c 0.1) 0.1))
      (setq res (cons _c res))
      ) ;_ end of if
    (setq _c (1+ _c))
    ) ;_ end of repeat
  (reverse res)
  ) ;_ end of defun
И получил результат:
Код:
[Выделить все]
 '(-64.0   -63.0   -62.0   -61.0   -60.0
  -59.0   -58.0   -57.0   -56.0   -55.0   -54.0   -53.0   -52.0   -51.0   -50.0
  -49.0   -48.0   -47.0   -46.0   -45.0   -44.0   -43.0   -42.0   -41.0   -40.0
  -39.0   -38.0   -37.0   -36.0   -35.0   -34.0   -33.0   -32.0   -31.0   -30.0
  -29.0   -28.0   -27.0   -26.0   -25.0   -24.0   -23.0   -22.0   -21.0   -20.0
  -19.0   -18.0   -17.0
  -4.0    -3.0    -2.0
  0.0
  1.0     2.0     3.0
  16.0    17.0    18.0    19.0    20.0
  21.0    22.0    23.0    24.0    25.0    26.0    27.0    28.0    29.0    30.0
  31.0    32.0    33.0    34.0    35.0    36.0    37.0    38.0    39.0    40.0
  41.0    42.0    43.0    44.0    45.0    46.0    47.0    48.0    49.0    50.0
  51.0    52.0    53.0    54.0    55.0    56.0    57.0    58.0    59.0    60.0
  61.0    62.0    63.0
  )

Собственно вопрос: чем обуславливается подобное поведение стандартной функции и как можно обеспечить ее устойчивую работу?
P.S. ACAD2016Eng, обновления установлены.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Просмотров: 1072
 
Непрочитано 11.01.2017, 13:09
1 | #2
tutanhamon


 
Блог
 
Регистрация: 06.09.2007
Архангельск/СПб
Сообщений: 460


Проблема, как можете видеть по ссылке, обсуждалась как минимум с начала 2000-х, а то и раньше.
Корни её - в числах с плавающей запятой
Цитата:
Unhappily, the issue will always remain with us, no matter how wide the registers get. The reason is because some real numbers cannot ever be represented exactly in binary, no matter how precise you get.
tutanhamon вне форума  
 
Автор темы   Непрочитано 11.01.2017, 13:38
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Забавно... Спасибо, буду выдумывать "обходные" пути.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.01.2017, 17:19
#4
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Я уже как-то пытался завести разговор о том, что можно неожиданно получить странный результат, который не объяснишь, не видя, что происходит на уровне процессора. Ещё раз воспроизведу свой пример в максимально упрощённом виде:
Код:
[Выделить все]
 Команда: (vl-string-trim "1043.96," "1043.96,5003.63")
"5"

Команда: (vl-string-trim "1043.97," "1043.97,5003.63")
"5003.6"

Команда: (vl-string-trim "1043.98," "1043.98,5003.63")
"5003.6"

Команда: (vl-string-trim "1043.99," "1043.99,5003.63")
"5003.6"

Команда: (vl-string-trim "1044.00," "1044.00,5003.63")
"5003.63"
P_S вне форума  
 
Автор темы   Непрочитано 11.01.2017, 22:07
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


P_S, https://knowledge.autodesk.com/searc...62389-htm.html + F1
vl-string-trim обрубает с обеих сторон в строке все символы, которые встречаются в первом параметре до тех пор, пока не встречается символ, не попадающий в набор. Так что результат вполне предсказуем:
Код:
[Выделить все]
 _$ (vl-string-trim "1043.96," "1043.96,5003.63")
"5"
_$ (vl-string-trim ".,013469" "1043.96,5003.63")
"5"
_$ (vl-string-trim ".,013469" "1043.96,5003.63,1111111111111")
"5"
_$ (vl-string-trim ".,013469" "1043.96,5003.63,1111111111111444444444444444444444444")
"5"
_$ 
----- добавлено через ~2 мин. -----
Туда же:
Код:
[Выделить все]
 _$ (strcase(ver))
"VISUAL LISP 2016 (EN)"
_$ (vl-string-trim "IPVAISULE()" (strcase (ver)))
" LISP 2016 (EN"
_$ (vl-string-trim "ANVISULPE()" (strcase (ver)))
" LISP 2016 "
_$ (vl-string-trim "ANVISULPE() " (strcase (ver)))
"2016"
_$ 
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.01.2017, 23:36
1 | #6
VoVoRoNaLe

Конструктор
 
Регистрация: 29.10.2007
Сообщений: 157


http://www.delphikingdom.com/asp/vie...?catalogid=374
немного теории
VoVoRoNaLe вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему неправильно выполняется equal?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Почему неправильно считает модуль Add Line в Mathcad? eilukha Другие CAD системы 6 03.10.2015 08:17
Почему при динамическом вводе получается линия другой длины? madstoker Динамические блоки 24 17.04.2013 11:40
Почему СКАД неправильно проверяет колонны при внецетренном сжатии? Двоешник SCAD 9 18.10.2012 10:00
Как переделать коды AutoCAD R14 работающие с БД для работы в AutoCAD 2009 Andru1968 Программирование 84 12.10.2011 08:19