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

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

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

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

Надеюсь будет полезна небольшая функция для округления чисел.
Может использоваться, например для корректировки длин линий, величины размера и т.д.
Код:
[Выделить все]
;|Функция (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
Просмотров: 33616
 
Непрочитано 24.06.2008, 14:39
#2
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


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

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


Тогда уж _dwgru-value-round или как-то так надо называть...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2008, 14:42
#4
Alaspher


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


Сдаётся мне, что результат будет одинаков:
Код:
[Выделить все]
(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
С.-Петербург
Сообщений: 39,787


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


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


Выкладываю немного доработанную функцию, позволяющую округлять ещё и список чисел. У меня это было вызвано необходимостью округлять значения координат до определённой точности.
Код:
[Выделить все]
;|===========================================================
*	Функция округления чисел задаваемой точностью
*	Параметры вызова:
*		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,439
Отправить сообщение для Елпанов Евгений с помощью 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,439
Отправить сообщение для Елпанов Евгений с помощью 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,439
Отправить сообщение для Елпанов Евгений с помощью 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,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


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

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью 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
Луцьк
Сообщений: 179


если дело в скорости, то...
Код:
[Выделить все]
(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,825


Цитата:
Сообщение от 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 вне форума  
 
Непрочитано 14.09.2018, 02:29
#19
superkot007


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


Цитата:
Сообщение от Alaspher Посмотреть сообщение
Сдаётся мне, что результат будет одинаков:
Код:
[Выделить все]
(defun round (val prec)
 (* (fix (+ (/ val (float prec)) 0.5)) prec)
)
Не всегда.
Округление "до сотых" функцией из шапки сбоИт - 134.465 с точностью 0.01 округляется до 134.46.
Возможно, не принципиально, но все-таки...
Если поменять местами строки
Код:
[Выделить все]
 
       (+ (* (fix x) precision) precision)
       (* (fix x) precision)
то 134.465 округляется правильно, до 134.47.
superkot007 вне форума  
 
Непрочитано 05.12.2022, 05:57
#20
С/-\Ш/-\

геодезия
 
Регистрация: 06.06.2015
Новосибирск
Сообщений: 2


Округление по Гауссу правильно 134.46, т.к. после 6 идёт 5. Если бы перед 5 стояла нечетная цифра, то тогда бы ей добавилась единица (134.455 = 134.46)
С/-\Ш/-\ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > Округление числа

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Округление текста Димас AutoCAD 25 12.02.2024 08:26
Электропривод.Смысл числа 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