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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Необъяснимое поведение fix

Необъяснимое поведение fix

Ответ
Поиск в этой теме
Непрочитано 25.09.2018, 11:41 #1
Необъяснимое поведение fix
a-karlson
 
Регистрация: 06.06.2009
Сообщений: 19

Господа, доброго времени суток!
Не может ли кто-нибудь рассказать, почему fix при округлении вычитает единицу?
т.е. мы имеем число 3550.0, желаем превратить его в int и ждем, что получится 3550, но fix выдает 3449
Просмотров: 8667
 
Непрочитано 25.09.2018, 11:55
#2
Кулик Алексей aka kpblc
Moderator

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


Мы имеем или наблюдаем? И явно у тебя вычитается не 1, а 51
P.S. Число 3549.9996666888999999 вполне может показываться как 3550.0:
Код:
[Выделить все]
 _$ (setq a 3549.99999991)
3550.0
_$ (fix a)
3549
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.09.2018, 14:41
#3
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от a-karlson Посмотреть сообщение
мы имеем число 3550.0, желаем превратить его в int и ждем, что получится 3550, но fix выдает 3449
Если вычесть 3449 из 3550, то получим 101.
Setvar вне форума  
 
Непрочитано 25.09.2018, 15:13
#4
Кулик Алексей aka kpblc
Moderator

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


Да, ошибся я
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.09.2018, 20:32
#5
a-karlson


 
Регистрация: 06.06.2009
Сообщений: 19


сорри народ, ошибся, не 3449, а 3549, но fix, все-таки, ведет себя странно
a-karlson вне форума  
 
Непрочитано 25.09.2018, 21:18
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,001


ничего странного, для вещественных чисел понятие равенства само по себе условно - всего лишь в пределах принятого допуска...
Сергей812 вне форума  
 
Непрочитано 25.09.2018, 21:19
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Сообщение от a-karlson Посмотреть сообщение
fix, все-таки, ведет себя странно
Это давно известно. Вот функция для округления

Код:
[Выделить все]
 (defun ru-match-round (num)
    ;; (ru-match-round 1.5) =>2
    ;; (ru-match-round 1.49) =>1  
    (if	(>= (abs (- num (fix num))) 0.5)
	(if (minusp num)
	    (1- (fix num))
	    (1+ (fix num))
	) 
	(fix num)
    ) 
) 

ShaggyDoc вне форума  
 
Непрочитано 25.09.2018, 21:35
#8
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Автор темы привел в качестве примера вполне конкретное число: 3550.0
Результаты выполнения функции:
Команда: (fix 3550.0)
3550
Команда: (setq a 3550.0)
3550.0
Команда: (fix a)
3550
Никакого 3549 не наблюдается.
AutoCAD 2014.
Setvar вне форума  
 
Непрочитано 25.09.2018, 21:42
#9
Кулик Алексей aka kpblc
Moderator

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


#2, вопрос в представлении и реальном значении.
(rtos a 2 16) - что вернет? В а - обрабатываемое значение. А еще лучше - вообще кусок кода, который вычисляет это значение.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.09.2018, 23:01
#10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Setvar Посмотреть сообщение
Автор темы привел в качестве примера вполне конкретное число: 3550.0
Это он так думает. И вполне возможно, что AutoCAD его так отображает (в командной строке или в Панели свойств или в размерном тексте). А в действительности это число "чуть меньше", чем 3550.0
Александр Ривилис вне форума  
 
Непрочитано 25.09.2018, 23:58
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,001


интересно, а какой эпсилон заложен в акаде и в самом лиспе.

В том же C# определены как константы:
Цитата:
public const float Epsilon = 1.401298E-45;
public const double Epsilon = 4.94065645841247E-324;
и если разница двух значений по модулю не превышают половину эпсилон - они считаются равными.
Сергей812 вне форума  
 
Непрочитано 26.09.2018, 00:10
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
интересно, а какой эпсилон заложен в акаде и в самом лиспе.

В том же C# определены как константы:
и если разница двух значений по модулю не превышают половину эпсилон - они считаются равными.
Тут дело не в языке программирования, а в хранении и обработке double:
https://en.wikipedia.org/wiki/Double...g-point_format
(DBL_EPSILON: 2^52 ≈ 2.2204460492503131e-016)
Александр Ривилис вне форума  
 
Непрочитано 26.09.2018, 09:43
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,001


И на русском в википендии
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.09.2018, 10:21
#14
a-karlson


 
Регистрация: 06.06.2009
Сообщений: 19


Цитата:
Сообщение от Setvar Посмотреть сообщение
Автор темы привел в качестве примера вполне конкретное число: 3550.0
Результаты выполнения функции:
Команда: (fix 3550.0)
3550
Команда: (setq a 3550.0)
3550.0
Команда: (fix a)
3550
Никакого 3549 не наблюдается.
AutoCAD 2014.
в том-то и дело, что поведение fix нестабильное, вот 4 итерации, левое число - длина объекта (объекты, разумеется, одни и те же), правое получено (float (fix <от левого>)), мы видим, что некоторые числа фиксу нравятся больше других и необязательно с первого раза
Код:
[Выделить все]
319.0 319.0 ---
995.0 995.0
852.0 852.0 ---
3445.0 3445.0 ---
148.0 148.0
3745.0 3745.0
463.0 462.0 ---
1680.0 1680.0
3731.0 3731.0
2442.0 2442.0
1009.0 1009.0
312.0 312.0 ---
1077.0 1077.0


319.0 318.0 <<<
995.0 995.0
852.0 851.0 <<<
3445.0 3444.0 <<<
148.0 148.0
3745.0 3745.0
462.0 461.0 <<<
1680.0 1680.0
3731.0 3731.0
2442.0 2442.0
1009.0 1009.0
312.0 311.0 <<<
1077.0 1076.0 <<<


318.0 317.0 <<<
995.0 995.0
851.0 851.0
3444.0 3444.0
148.0 148.0
3745.0 3745.0
461.0 460.0 <<<
1680.0 1680.0
3731.0 3731.0
2442.0 2442.0
1009.0 1009.0
311.0 311.0
1076.0 1076.0


317.0 316.0 <<<
995.0 995.0
851.0 851.0
3444.0 3444.0
148.0 148.0
3745.0 3745.0
460.0 459.0 <<<
1680.0 1680.0
3731.0 3731.0
2442.0 2442.0
1009.0 1009.0
311.0 311.0
----- добавлено через ~2 мин. -----
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Это он так думает. И вполне возможно, что AutoCAD его так отображает (в командной строке или в Панели свойств или в размерном тексте). А в действительности это число "чуть меньше", чем 3550.0
число вбивалось в том числе и вручную, т.е. прям в панели свойств - 3550
a-karlson вне форума  
 
Непрочитано 26.09.2018, 10:27
#15
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,001


ну а функция из поста №7 что выдает?
Сергей812 вне форума  
 
Автор темы   Непрочитано 26.09.2018, 10:38
#16
a-karlson


 
Регистрация: 06.06.2009
Сообщений: 19


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну а функция из поста №7 что выдает?
Код:
[Выделить все]
316.0 316.0
995.0 995.0
851.0 851.0
3444.0 3444.0
148.0 148.0
3745.0 3745.0
459.0 459.0
1680.0 1680.0
3731.0 3731.0
2442.0 2442.0
1009.0 1009.0
311.0 311.0

316.0 316.0
995.0 995.0
851.0 851.0
3444.0 3444.0
148.0 148.0
3745.0 3745.0
459.0 459.0
1680.0 1680.0
3731.0 3731.0
2442.0 2442.0
1009.0 1009.0
311.0 311.0
но это было очевидно сразу, там же костыль в виде 1+
a-karlson вне форума  
 
Непрочитано 26.09.2018, 10:58
#17
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,001


ну если человек с опытом использования лиспа 10+ лет говорит, что некорректная реализация готовой функции fix
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Это давно известно.
значит, придется использовать обертку-костыль. Или переходите на ЯП, которые развиваются и где фиксятся баги.
Сергей812 вне форума  
 
Непрочитано 26.09.2018, 12:42
#18
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun test ()
  (repeat 5
    (princ "\n *** ")
    (mapcar (function (lambda (x)
                        (princ (strcat "\nValue = "
                                       (rtos x 2 16)
                                       "; View = "
                                       (vl-princ-to-string x)
                                       "; Fix = "
                                       (itoa (fix x))
                                       "; Float = "
                                       (rtos (float x) 2 16)
                                       "; Float(Fix) = "
                                       (rtos (float (fix x)) 2 16)
                                       ) ;_ end of strcat
                               ) ;_ end of princ
                        ) ;_ end of lambda
                      ) ;_ end of function
            '(319.0 995.0 852.0 3445.0 148.0 3745.0 462.0 1680.0 3731.0 2442.0 1009.0 312.0 1077.0)
            ) ;_ end of mapcar
    (princ "\n *** ")
    ) ;_ end of repeat
  (princ)
  ) ;_ end of defun
Результат:
Код:
[Выделить все]
 _$ (test)

 *** 
Value = 319; View = 319.0; Fix = 319; Float = 319; Float(Fix) = 319
Value = 995.0000000000001; View = 995.0; Fix = 995; Float = 995.0000000000001; Float(Fix) = 995.0000000000001
Value = 851.9999999999999; View = 852.0; Fix = 852; Float = 851.9999999999999; Float(Fix) = 851.9999999999999
Value = 3445; View = 3445.0; Fix = 3445; Float = 3445; Float(Fix) = 3445
Value = 148; View = 148.0; Fix = 148; Float = 148; Float(Fix) = 148
Value = 3745; View = 3745.0; Fix = 3745; Float = 3745; Float(Fix) = 3745
Value = 462; View = 462.0; Fix = 462; Float = 462; Float(Fix) = 462
Value = 1680; View = 1680.0; Fix = 1680; Float = 1680; Float(Fix) = 1680
Value = 3731; View = 3731.0; Fix = 3731; Float = 3731; Float(Fix) = 3731
Value = 2442; View = 2442.0; Fix = 2442; Float = 2442; Float(Fix) = 2442
Value = 1009; View = 1009.0; Fix = 1009; Float = 1009; Float(Fix) = 1009
Value = 312; View = 312.0; Fix = 312; Float = 312; Float(Fix) = 312
Value = 1077; View = 1077.0; Fix = 1077; Float = 1077; Float(Fix) = 1077
 *** 
 *** 
Value = 319; View = 319.0; Fix = 319; Float = 319; Float(Fix) = 319
Value = 995.0000000000001; View = 995.0; Fix = 995; Float = 995.0000000000001; Float(Fix) = 995.0000000000001
Value = 851.9999999999999; View = 852.0; Fix = 852; Float = 851.9999999999999; Float(Fix) = 851.9999999999999
Value = 3445; View = 3445.0; Fix = 3445; Float = 3445; Float(Fix) = 3445
Value = 148; View = 148.0; Fix = 148; Float = 148; Float(Fix) = 148
Value = 3745; View = 3745.0; Fix = 3745; Float = 3745; Float(Fix) = 3745
Value = 462; View = 462.0; Fix = 462; Float = 462; Float(Fix) = 462
Value = 1680; View = 1680.0; Fix = 1680; Float = 1680; Float(Fix) = 1680
Value = 3731; View = 3731.0; Fix = 3731; Float = 3731; Float(Fix) = 3731
Value = 2442; View = 2442.0; Fix = 2442; Float = 2442; Float(Fix) = 2442
Value = 1009; View = 1009.0; Fix = 1009; Float = 1009; Float(Fix) = 1009
Value = 312; View = 312.0; Fix = 312; Float = 312; Float(Fix) = 312
Value = 1077; View = 1077.0; Fix = 1077; Float = 1077; Float(Fix) = 1077
 *** 
 *** 
Value = 319; View = 319.0; Fix = 319; Float = 319; Float(Fix) = 319
Value = 995.0000000000001; View = 995.0; Fix = 995; Float = 995.0000000000001; Float(Fix) = 995.0000000000001
Value = 851.9999999999999; View = 852.0; Fix = 852; Float = 851.9999999999999; Float(Fix) = 851.9999999999999
Value = 3445; View = 3445.0; Fix = 3445; Float = 3445; Float(Fix) = 3445
Value = 148; View = 148.0; Fix = 148; Float = 148; Float(Fix) = 148
Value = 3745; View = 3745.0; Fix = 3745; Float = 3745; Float(Fix) = 3745
Value = 462; View = 462.0; Fix = 462; Float = 462; Float(Fix) = 462
Value = 1680; View = 1680.0; Fix = 1680; Float = 1680; Float(Fix) = 1680
Value = 3731; View = 3731.0; Fix = 3731; Float = 3731; Float(Fix) = 3731
Value = 2442; View = 2442.0; Fix = 2442; Float = 2442; Float(Fix) = 2442
Value = 1009; View = 1009.0; Fix = 1009; Float = 1009; Float(Fix) = 1009
Value = 312; View = 312.0; Fix = 312; Float = 312; Float(Fix) = 312
Value = 1077; View = 1077.0; Fix = 1077; Float = 1077; Float(Fix) = 1077
 *** 
 *** 
Value = 319; View = 319.0; Fix = 319; Float = 319; Float(Fix) = 319
Value = 995.0000000000001; View = 995.0; Fix = 995; Float = 995.0000000000001; Float(Fix) = 995.0000000000001
Value = 851.9999999999999; View = 852.0; Fix = 852; Float = 851.9999999999999; Float(Fix) = 851.9999999999999
Value = 3445; View = 3445.0; Fix = 3445; Float = 3445; Float(Fix) = 3445
Value = 148; View = 148.0; Fix = 148; Float = 148; Float(Fix) = 148
Value = 3745; View = 3745.0; Fix = 3745; Float = 3745; Float(Fix) = 3745
Value = 462; View = 462.0; Fix = 462; Float = 462; Float(Fix) = 462
Value = 1680; View = 1680.0; Fix = 1680; Float = 1680; Float(Fix) = 1680
Value = 3731; View = 3731.0; Fix = 3731; Float = 3731; Float(Fix) = 3731
Value = 2442; View = 2442.0; Fix = 2442; Float = 2442; Float(Fix) = 2442
Value = 1009; View = 1009.0; Fix = 1009; Float = 1009; Float(Fix) = 1009
Value = 312; View = 312.0; Fix = 312; Float = 312; Float(Fix) = 312
Value = 1077; View = 1077.0; Fix = 1077; Float = 1077; Float(Fix) = 1077
 *** 
 *** 
Value = 319; View = 319.0; Fix = 319; Float = 319; Float(Fix) = 319
Value = 995.0000000000001; View = 995.0; Fix = 995; Float = 995.0000000000001; Float(Fix) = 995.0000000000001
Value = 851.9999999999999; View = 852.0; Fix = 852; Float = 851.9999999999999; Float(Fix) = 851.9999999999999
Value = 3445; View = 3445.0; Fix = 3445; Float = 3445; Float(Fix) = 3445
Value = 148; View = 148.0; Fix = 148; Float = 148; Float(Fix) = 148
Value = 3745; View = 3745.0; Fix = 3745; Float = 3745; Float(Fix) = 3745
Value = 462; View = 462.0; Fix = 462; Float = 462; Float(Fix) = 462
Value = 1680; View = 1680.0; Fix = 1680; Float = 1680; Float(Fix) = 1680
Value = 3731; View = 3731.0; Fix = 3731; Float = 3731; Float(Fix) = 3731
Value = 2442; View = 2442.0; Fix = 2442; Float = 2442; Float(Fix) = 2442
Value = 1009; View = 1009.0; Fix = 1009; Float = 1009; Float(Fix) = 1009
Value = 312; View = 312.0; Fix = 312; Float = 312; Float(Fix) = 312
Value = 1077; View = 1077.0; Fix = 1077; Float = 1077; Float(Fix) = 1077
 *** 
Для ради интересу поменял код:
Код:
[Выделить все]
 (defun test ()
  (repeat 5
    (princ "\n *** ")
    (mapcar (function (lambda (x)
                        (princ (strcat "\nValue = "
                                       (rtos x 2 16)
                                       "\tView = "
                                       (vl-princ-to-string x)
                                       "\tFix = "
                                       (itoa (fix x))
                                       "\tFloat = "
                                       (rtos (float x) 2 16)
                                       "\tFloat(Fix) = "
                                       (rtos (float (fix x)) 2 16)
                                       ) ;_ end of strcat
                               ) ;_ end of princ
                        ) ;_ end of lambda
                      ) ;_ end of function
            '(319.0 995 852 3445.0 148.0 3745.0 462.0 1680.0 3731.0 2442.0 1009.0 312.0 1077.0)
            ) ;_ end of mapcar
    (princ "\n *** ")
    ) ;_ end of repeat
  (princ)
  ) ;_ end of defun
И как результат:
Код:
[Выделить все]
 _$ (test)

 *** 
Value = 319	View = 319.0	Fix = 319	Float = 319	Float(Fix) = 319
Value = 995.0000000000001	View = 995	Fix = 995	Float = 995.0000000000001	Float(Fix) = 995.0000000000001
Value = 851.9999999999999	View = 852	Fix = 852	Float = 851.9999999999999	Float(Fix) = 851.9999999999999
Value = 3445	View = 3445.0	Fix = 3445	Float = 3445	Float(Fix) = 3445
Value = 148	View = 148.0	Fix = 148	Float = 148	Float(Fix) = 148
Value = 3745	View = 3745.0	Fix = 3745	Float = 3745	Float(Fix) = 3745
Value = 462	View = 462.0	Fix = 462	Float = 462	Float(Fix) = 462
Value = 1680	View = 1680.0	Fix = 1680	Float = 1680	Float(Fix) = 1680
Value = 3731	View = 3731.0	Fix = 3731	Float = 3731	Float(Fix) = 3731
Value = 2442	View = 2442.0	Fix = 2442	Float = 2442	Float(Fix) = 2442
Value = 1009	View = 1009.0	Fix = 1009	Float = 1009	Float(Fix) = 1009
Value = 312	View = 312.0	Fix = 312	Float = 312	Float(Fix) = 312
Value = 1077	View = 1077.0	Fix = 1077	Float = 1077	Float(Fix) = 1077
 *** 
 *** 
Value = 319	View = 319.0	Fix = 319	Float = 319	Float(Fix) = 319
Value = 995.0000000000001	View = 995	Fix = 995	Float = 995.0000000000001	Float(Fix) = 995.0000000000001
Value = 851.9999999999999	View = 852	Fix = 852	Float = 851.9999999999999	Float(Fix) = 851.9999999999999
Value = 3445	View = 3445.0	Fix = 3445	Float = 3445	Float(Fix) = 3445
Value = 148	View = 148.0	Fix = 148	Float = 148	Float(Fix) = 148
Value = 3745	View = 3745.0	Fix = 3745	Float = 3745	Float(Fix) = 3745
Value = 462	View = 462.0	Fix = 462	Float = 462	Float(Fix) = 462
Value = 1680	View = 1680.0	Fix = 1680	Float = 1680	Float(Fix) = 1680
Value = 3731	View = 3731.0	Fix = 3731	Float = 3731	Float(Fix) = 3731
Value = 2442	View = 2442.0	Fix = 2442	Float = 2442	Float(Fix) = 2442
Value = 1009	View = 1009.0	Fix = 1009	Float = 1009	Float(Fix) = 1009
Value = 312	View = 312.0	Fix = 312	Float = 312	Float(Fix) = 312
Value = 1077	View = 1077.0	Fix = 1077	Float = 1077	Float(Fix) = 1077
 *** 
 *** 
Value = 319	View = 319.0	Fix = 319	Float = 319	Float(Fix) = 319
Value = 995.0000000000001	View = 995	Fix = 995	Float = 995.0000000000001	Float(Fix) = 995.0000000000001
Value = 851.9999999999999	View = 852	Fix = 852	Float = 851.9999999999999	Float(Fix) = 851.9999999999999
Value = 3445	View = 3445.0	Fix = 3445	Float = 3445	Float(Fix) = 3445
Value = 148	View = 148.0	Fix = 148	Float = 148	Float(Fix) = 148
Value = 3745	View = 3745.0	Fix = 3745	Float = 3745	Float(Fix) = 3745
Value = 462	View = 462.0	Fix = 462	Float = 462	Float(Fix) = 462
Value = 1680	View = 1680.0	Fix = 1680	Float = 1680	Float(Fix) = 1680
Value = 3731	View = 3731.0	Fix = 3731	Float = 3731	Float(Fix) = 3731
Value = 2442	View = 2442.0	Fix = 2442	Float = 2442	Float(Fix) = 2442
Value = 1009	View = 1009.0	Fix = 1009	Float = 1009	Float(Fix) = 1009
Value = 312	View = 312.0	Fix = 312	Float = 312	Float(Fix) = 312
Value = 1077	View = 1077.0	Fix = 1077	Float = 1077	Float(Fix) = 1077
 *** 
 *** 
Value = 319	View = 319.0	Fix = 319	Float = 319	Float(Fix) = 319
Value = 995.0000000000001	View = 995	Fix = 995	Float = 995.0000000000001	Float(Fix) = 995.0000000000001
Value = 851.9999999999999	View = 852	Fix = 852	Float = 851.9999999999999	Float(Fix) = 851.9999999999999
Value = 3445	View = 3445.0	Fix = 3445	Float = 3445	Float(Fix) = 3445
Value = 148	View = 148.0	Fix = 148	Float = 148	Float(Fix) = 148
Value = 3745	View = 3745.0	Fix = 3745	Float = 3745	Float(Fix) = 3745
Value = 462	View = 462.0	Fix = 462	Float = 462	Float(Fix) = 462
Value = 1680	View = 1680.0	Fix = 1680	Float = 1680	Float(Fix) = 1680
Value = 3731	View = 3731.0	Fix = 3731	Float = 3731	Float(Fix) = 3731
Value = 2442	View = 2442.0	Fix = 2442	Float = 2442	Float(Fix) = 2442
Value = 1009	View = 1009.0	Fix = 1009	Float = 1009	Float(Fix) = 1009
Value = 312	View = 312.0	Fix = 312	Float = 312	Float(Fix) = 312
Value = 1077	View = 1077.0	Fix = 1077	Float = 1077	Float(Fix) = 1077
 *** 
 *** 
Value = 319	View = 319.0	Fix = 319	Float = 319	Float(Fix) = 319
Value = 995.0000000000001	View = 995	Fix = 995	Float = 995.0000000000001	Float(Fix) = 995.0000000000001
Value = 851.9999999999999	View = 852	Fix = 852	Float = 851.9999999999999	Float(Fix) = 851.9999999999999
Value = 3445	View = 3445.0	Fix = 3445	Float = 3445	Float(Fix) = 3445
Value = 148	View = 148.0	Fix = 148	Float = 148	Float(Fix) = 148
Value = 3745	View = 3745.0	Fix = 3745	Float = 3745	Float(Fix) = 3745
Value = 462	View = 462.0	Fix = 462	Float = 462	Float(Fix) = 462
Value = 1680	View = 1680.0	Fix = 1680	Float = 1680	Float(Fix) = 1680
Value = 3731	View = 3731.0	Fix = 3731	Float = 3731	Float(Fix) = 3731
Value = 2442	View = 2442.0	Fix = 2442	Float = 2442	Float(Fix) = 2442
Value = 1009	View = 1009.0	Fix = 1009	Float = 1009	Float(Fix) = 1009
Value = 312	View = 312.0	Fix = 312	Float = 312	Float(Fix) = 312
Value = 1077	View = 1077.0	Fix = 1077	Float = 1077	Float(Fix) = 1077
 *** 
Еще раз: откуда берутся цифры? Что показывает rtos с максимальным количеством значащих знаков?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.09.2018, 14:02
1 | 1 #19
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


А почему бы не посмотреть описание fix в документации? Эта функция преобразовывает (не округляет) число в целое. Вещественные числа усекаются до ближайшего целого путем отбрасывания дробной части.

Это не баг, а "фича". Сразу была в Автолисп еще версии R10. Видимо предполагая, что иные виды округления разработает программист.

А в "ЯП, которые развиваются и где фиксятся баги" имеются наборы других функций. Например в Delphi есть функции округления Ceil (X), Floor (X), Frac (X), Int(X), Round(X), Trunc(X). Причем округления, в основном, внутри себя используют Int.

Функция fix в Автолисп работает как Trunc(X) или Int(X). Еще надо помнить, что Лисп сам определяет тип переданного аргумента "по написанию"
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 27.09.2018, 18:08
#20
a-karlson


 
Регистрация: 06.06.2009
Сообщений: 19


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А почему бы не посмотреть описание fix в документации? Эта функция преобразовывает (не округляет) число в целое. Вещественные числа усекаются до ближайшего целого путем отбрасывания дробной части.

Это не баг, а "фича". Сразу была в Автолисп еще версии R10. Видимо предполагая, что иные виды округления разработает программист.
в то-то и дело, что я вижу, что иногда fix отбрасывает целую единицу в числе, у которого отсутствует дробная часть, насколько это можно считать фичей?
Цитата:
Сообщение от ShaggyDoc

А в "ЯП, которые развиваются и где фиксятся баги" имеются наборы других функций. Например в Delphi есть функции округления Ceil (X), Floor (X), Frac (X), Int(X), Round(X), Trunc(X). Причем округления, в основном, внутри себя используют Int.

Функция fix в Автолисп работает как Trunc(X) или Int(X).
увы, но я так и не научился автолиспом доставать функции из dll
Цитата:
Сообщение от ShaggyDoc
Еще надо помнить, что Лисп сам определяет тип переданного аргумента "по написанию"
в смысле?
a-karlson вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Необъяснимое поведение fix

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посоветуйте, пожалуйста, литературу по проектированию фундаментов на основаниях, содержащих слой сильновыветрелого грунта (рухляка) или поведение рухляка под нагрузкой Zvezdaneba Поиск литературы, чертежей, моделей и прочих материалов 5 28.07.2016 15:11
Странное поведение функции GetPoint krok64 Программирование 3 15.06.2016 08:01
Непонятное поведение цикла по списку swkx Программирование 33 28.03.2012 15:39
Поведение AutoCAD 2005 после установки 2006 Кулик Алексей aka kpblc AutoCAD 12 10.08.2005 08:49