Скачать NANOCAD Pдгы 8.5
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > Округление числа

Округление числа

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 24.06.2008, 14:23 #1
Округление числа
CB
 
Конструирование в области нефтеразведки
 
Гомель
Регистрация: 10.02.2006
Сообщений: 321

CB вне форума Вставить имя

Надеюсь будет полезна небольшая функция для округления чисел.
Может использоваться, например для корректировки длин линий, величины размера и т.д.
Код:
[Выделить все]
;|Функция (round число <точность округления>)
Аргумент ЧИСЛО округляется в зависимости от значения аргумента <точность округления>
Примеры вызова:
(round 126.643 0.1) 126.6 
(round 126.663 0.1) 126.7
(round 126.243 0.5) 126.0
(round 126.643 0.5) 126.5
(round 126.843 0.5) 127.0
(round 126.443 1) 126
(round 126.543 1) 127
(round 122.343 5) 120
(round 122.843 5) 125
(round 126.843 5) 125
(round 127.843 5) 130
Ну и т.д.
|;
(defun round (value precision)
  ((lambda (x)
     (if (apply '<= (list (rem x 1.) 0.5))
       (* (fix x) precision)
       (+ (* (fix x) precision) precision)
     ) ;_ end of if
   ) ;_ end of lambda
    (apply '/ (mapcar 'float (list value precision)))
  )
) ;_ end of defun
Просмотров: 14756
 
Непрочитано 24.06.2008, 14:39
#2
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,164
Отправить сообщение для zenon с помощью ICQ


Не понял, а каких чисел? чисел чего?
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.06.2008, 14:40
#3
Кулик Алексей aka kpblc
Moderator

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


Тогда уж _dwgru-value-round или как-то так надо называть...
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.06.2008, 14:42
#4
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 773


Сдаётся мне, что результат будет одинаков:
Код:
[Выделить все]
(defun round (val prec)
 (* (fix (+ (/ val (float prec)) 0.5)) prec)
)
Alaspher вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 24.06.2008, 15:35
#5
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Кулик Алексей aka kpblc
Здесь раздел только для функций библиотеки _dwgru или можно выкладывать функции не претендующие для нее? Я выложил просто так...
Alaspher
Сдается мне, что тоже... Как всегда красиво!
CB вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.06.2008, 15:38
#6
Кулик Алексей aka kpblc
Moderator

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


CB, ну как бы тут функции, которые планируется включать в DwgRuLispLib Ну и именование соответствующее
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 15.07.2008, 16:29
#7
Mazai


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


Выкладываю немного доработанную функцию, позволяющую округлять ещё и список чисел. У меня это было вызвано необходимостью округлять значения координат до определённой точности.
Код:
[Выделить все]
;|===========================================================
*	Функция округления чисел задаваемой точностью
*	Параметры вызова:
*		value 		- число или список чисел
*		precision 	- точность округления
*
*	Пример вызова:
*		(_dwgru-value-round (list 123.122 234.32) 0.01)
*					-> (123.12 234.32)
*		(_dwgru-value-round 123.122 0.01)
*					-> 123.12
=============================================================|;

(defun _dwgru-value-round (value precision)
   (if (= (type value) 'LIST)
     (mapcar '(lambda (El) (* (fix (+ (/ El (float precision)) 0.5)) precision)) value)
     (* (fix (+ (/ value (float precision)) 0.5)) precision)
   ) ;_ end if
)
Mazai вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 22.10.2008, 23:19
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Странные у вас округления...
Для сравнения, я взял все представленные здесь программы и стандартную rtos.
Чтоб небыло разночтений, сначала выкладываю все коды программ:
Код:
[Выделить все]
(defun round (value precision)
  ((lambda (x)
     (if (apply '<= (list (rem x 1.) 0.5))
       (* (fix x) precision)
       (+ (* (fix x) precision) precision)
     ) ;_ end of if
   ) ;_ end of lambda
    (apply '/ (mapcar 'float (list value precision)))
  )
)
(defun round1 (val prec)
 (* (fix (+ (/ val (float prec)) 0.5)) prec)
)
(defun _dwgru-value-round (value precision)
   (if (= (type value) 'LIST)
     (mapcar '(lambda (El) (* (fix (+ (/ El (float precision)) 0.5)) precision)) value)
     (* (fix (+ (/ value (float precision)) 0.5)) precision)
   ) ;_ end if
)
А теперь сравнительный анализ отрицательных чисел:
Код:
[Выделить все]
(atof (rtos -1.04 2 1)) ; -1.0
(round -1.04 0.1) ; -0.9
(round1 -1.04 0.1) ; -1.0
(_dwgru-value-round -1.04 0.1) ; -0.9

(atof (rtos -1.06 2 1)) ; -1.1
(round -1.06 0.1) ; -1.0
(round1 -1.06 0.1) ; -1.0
(_dwgru-value-round -1.06 0.1) ; -1.0
Елпанов Евгений вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.10.2008, 01:43
#9
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


>EE
Прикольно! Наступаем на те же грабли, только отрицательные.
__________________
Лень - великий двигатель прогресса!
KAI вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 23.10.2008, 11:14
#10
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


>Елпанов Евгений
Согласен... Наверно так будет корректнее:
Код:
[Выделить все]
(defun round (val prec)
  ((lambda (a)
     (* (fix ((eval a) (/ val (float prec)) 0.5)) prec)
   ) ;_ end of lambda
    (if (minusp val) - +)
  )
) ;_ end of defun
CB вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 23.10.2008, 16:03
#11
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от CB Посмотреть сообщение
>Елпанов Евгений
Согласен... Наверно так будет корректнее:
тогда уж так:
Код:
[Выделить все]
(defun round(val prec)
 (*(fix((if(minusp val)- +)(/ val(float prec))0.5))prec)
)
Хотя, я предпочитаю
Код:
[Выделить все]
(atof (rtos -1.06 2 1))
В конечном итоге, так быстрее...
Елпанов Евгений вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.10.2008, 03:48
#12
KAI

геологоразведка, строительство
 
Регистрация: 14.10.2003
Магадан
Сообщений: 311


Может моя функция подойдет?

Код:
[Выделить все]
;-----------------------------------------------------------------------------------
; Функция округления числа по правилам статистики (Правило четной цифры).
; (C)KAI, 2006 г. (413-2) 65-05-10 Магадан. http://geol-dh.ru/ (http://geol-dh.narod.ru/)
;-----------------------------------------------------------------------------------
(defun RTOS_ROUND_STAT (numb prec / numb_str numb_prec numb_int numb_temp)
  ; Параметры: numb - число для округления (вещественное или целое)
  ;            prec - точность округления (число чисел после десятичной точки)

  ; Возвращает: numb_str - строку с заданной точностью
  
  ;   Текущее значение системной переменной DIMZIN влияет вид возвращаемой строки:
  ;   DIMZIN = 0 - незначащие нули в строке выводятся,
  ;   DIMZIN = 8 - незначащие нули в строке отсекаются
  
  ; Как известно, AutoCAD при цифре 5 всегда выполняет округление предыдущей цифры в большую сторону.
  ; Что для некоторых случаев не всегда корректно (например, при подсчете запасов золота),
  ; так как в общем случае сумма таких округленных значений будет завышена.
  
  ; Округление в функции работает по "Правилу четной цифры".
  ;  Округление производится постепенно, справа налево:
  ;   1. когда последняя значащая цифра меньше 4, она просто отбрасывается;
  ;   2. в том случае, если она больше 6, ближайшая слева от нее цифра увеличивается на единицу;
  ;   3. когда она равна 5, ближайшая слева от нее цифра увеличивается на единицу, если она нечетная,
  ;   или не изменяется, если она четная
  ;
  ; Ограничения: Округление выполняется только по 3-м цифрам после заданной точности,
  ;               за пределами - округление идет по правилам Acad
  ;              Функция работает до значений numb_prec < 99'999'999'999'999,
  ;              то есть практически до 99 миллиардов при точности в 3 знака
  ;              при превышении данного значения - строка возвращается встроенной функцией RTOS
  ;
  (setq numb_str (rtos numb 2 prec)); значение по умолчанию, округление по правилам Acad
  (if (= geo_com_rstat- 1); эта переменная отвечает за округление по правилам статистики!
    (progn
      (setq numb_prec (* numb (expt 10 prec))); увеличиваем число на 10 в степени prec
      ; Проверка: цифры за пределами заданной точности лежат в указанных пределах?
      ; Пределы задаются такие, чтобы округление до десятых давало всегда цифру 5
      (if (and (< numb_prec 99999999999999)
               (> (setq numb_temp (atof (rtos (abs (- numb_prec (setq numb_int (fix numb_prec)))) 2 3))) 0.454)
               (< numb_temp 0.546)
               );and
        (if (/= (rem numb_int 2) 0);если число перед цифрой 5 - нечетное
          ;да: увеличиваем число на единицу и приводим к прежнему порядку
          (if (minusp numb_int); что для отрицательных чисел равносильно уменьшению на единицу!
            (setq numb_str (rtos (/ (1- numb_int) (expt 10.0 prec)) 2 prec))
            (setq numb_str (rtos (/ (1+ numb_int) (expt 10.0 prec)) 2 prec))
          )
          ;нет: только приводим к прежнему порядку
          (setq numb_str (rtos (/ numb_int (expt 10.0 prec)) 2 prec))
        )
      )
    )
  )
  numb_str ; строка с заданной точностью
);end of *** RTOS_ROUND_STAT ***
;
__________________
Лень - великий двигатель прогресса!
KAI вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 24.10.2008, 10:24
#13
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Собственно эта ф-ция не в противовес стандартной rtos, а просто для расширения возможностей при округлении чисел... Например можно ли с помощью rtos округлить так?
Код:
[Выделить все]
 
(round 126.243 0.5) 126.0
(round 126.643 0.5) 126.5
(round 126.843 0.5) 127.0
(round 122.343 5) 120
(round 122.843 5) 125
(round 126.843 5) 125
(round 127.843 5) 130
CB вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.10.2008, 13:46
#14
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от CB Посмотреть сообщение
Собственно эта ф-ция не в противовес стандартной rtos, а просто для расширения возможностей при округлении чисел... Например можно ли с помощью rtos округлить так?
Код:
[Выделить все]
 
(round 126.243 0.5) 126.0
(round 126.643 0.5) 126.5
(round 126.843 0.5) 127.0
(round 122.343 5) 120
(round 122.843 5) 125
(round 126.843 5) 125
(round 127.843 5) 130
для таких случаев, я тоже умножаю и делю на некоторое число, но для округлений использую rtos. Попробуй сравнить скорость этих программ и поймешь, что встроенная функция быстрее...
Елпанов Евгений вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.10.2008, 15:42
#15
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,542
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Еще тема про функции округления
http://www.theswamp.org/index.php?topic=18695.0
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.10.2008, 18:58
#16
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,440
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от VVA Посмотреть сообщение
Еще тема про функции округления
http://www.theswamp.org/index.php?topic=18695.0
ага, самой быстрой из всех, оказалась функция:
Код:
[Выделить все]
;; Joe Burke
(defun round (value to)
  (if (zerop to) value
    (* (atoi (rtos (/ (float value) to) 2 0)) to)))
т.е. использование fix - только видимость ускорения...
Елпанов Евгений вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 25.10.2008, 02:07
#17
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 133


если дело в скорости, то...
Код:
[Выделить все]
(defun vk_RoundReal (InReal Precision)
  (/ (fix (- (* InReal (setq Precision (expt 10. Precision)))
	     (/ (abs InReal) InReal -2.)
	  )
     )
     Precision
  )
)
хотя сам я использую (atof (rtos -1.06 2 1)), для надежности что ли

Последний раз редактировалось Vov.Ka, 11.11.2008 в 01:33.
Vov.Ka вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 08.05.2013, 15:53
#18
Krieger

инженер
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,655
Отправить сообщение для Krieger с помощью Skype™


Цитата:
Сообщение от CB Посмотреть сообщение
Собственно эта ф-ция не в противовес стандартной rtos, а просто для расширения возможностей при округлении чисел... Например можно ли с помощью rtos округлить так?
Код:
[Выделить все]
 
(round 126.243 0.5) 126.0
(round 126.643 0.5) 126.5
(round 126.843 0.5) 127.0
(round 122.343 5) 120
(round 122.843 5) 125
(round 126.843 5) 125
(round 127.843 5) 130
Можно.
Код:
[Выделить все]
(defun Kr_roundof (num presc / )
(* (atof (rtos (/ num presc) 2 0)) presc)
  )
__________________
Делай хорошо, плохо само получится.
Krieger вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > Округление числа

Инженерные консультации
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Округление текста Димас AutoCAD 23 28.01.2011 17:50
Электропривод.Смысл числа 9550 в формуле номинального момента. Владимир Егорьев Машиностроение 2 08.05.2008 09:38
размеры - числа после запятой soulkeeper AutoCAD 9 11.03.2008 11:17
Округление единиц v_alex AutoCAD 4 20.05.2007 09:07
Почему (vla-get-Alignment возвращает целые числа? {Smirnoff} Программирование 3 07.04.2004 18:51

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||


Размещение рекламы