ADN Club > Ошибки в AutoCAD и вертикальных приложениях
Некорректная работа функции trunc в атрибутах динамических блоков
Максим Маркевич:
Всем привет. При создании блока определенной сложности (я пока не понял какой) перестает корректно работать функция trunc в атрибуте блока:
Как видно из скриншота, trunc(4400/100) выдает 43, что кроме как глюком больше никак не назовешь.
Данный простой блок создан путем удаления "кусков" из сложного, в котором и был обнаружен данный глюк.
Заметил такую особенность - если блок потягать ручками, то он начинает считать корректно, если же вбивать через свойства значения длины, то блок неадекватен:
Возможно, кто-то сталкивался и может пояснить, в чем дело и как такое, вообще, может быть?
Хотелось бы отметить, что я несколько лет пользовался функцией trunc во всевозможных ее проявлениях и никогда подобных проблем не было.
Но тут ... подкрался незаметно.
Да, также хотелось бы отметить, что данная проблема имеет место на разных компах с AutoCAD 2016x64 и AutoCAD 2017x64.
Александр Ривилис:
Почему trunc, а не round?
Максим Маркевич:
--- Цитата: Александр Ривилис от 09-12-2016, 23:14:18 ---Почему trunc, а не round?
--- Конец цитаты ---
Потому что round округляет по правилам математики:
--- Код - Auto/Visual Lisp [Выбрать] ---round(4.3) = 4round(4.5) = 5round(4.7) = 5Чаще всего мне нужно либо целая часть, либо округление в большую сторону:
--- Код - Auto/Visual Lisp [Выбрать] ---trunc(x)trunc(x + 1)Ну да, можно было бы, конечно, и при помощи round сделать нечто подобное:
--- Код - Auto/Visual Lisp [Выбрать] ---round(x - 0.5) - округление в меньшую сторонуround(x + 0.5) - округление в большую сторонуНо я привык к trunc.
И у меня есть больше сотни блоков, где я уже пользовался trunc, проблемы начались только сейчас и только в конкретных блоках, но я не могу выделить критерии их возникновения.
UPD.
В общем-то, с round такая же шляпа в пределах моего "кривого" блока.
Александр Ривилис:
Ну что же. Увы, но это проблемы с точностью округления. Конечно это баг, но такой тонкий, что им вряд ли кто-то будет заниматься. Так что или переходи на round, или используй в формулах что-то такое: trunc((val1+fuzz)/val2) (например, fuzz = 1e-6):
Александр Ривилис:
Ну и ещё для убедительности, что в таком виде использовать trunc нельзя ни в коем случае (!!!):
Навигация
Перейти к полной версии