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

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

Построение функции округления

Ответ
Поиск в этой теме
Непрочитано 14.04.2009, 06:15 #1
Построение функции округления
Kirzaa
 
Регистрация: 14.04.2009
Сообщений: 18

Здравствуйте! Подскажите пожалуйста.
А как можно построить функцию округления до значащих цифр???
типа 0,00000255354 > 0,0000026
Просмотров: 3837
 
Непрочитано 14.04.2009, 07:25
#2
nik_mb

конструктор
 
Регистрация: 23.03.2009
Волгоград
Сообщений: 120


А чем такое не устраивает?
(atof (rtos 0.00000255354 2 7))
nik_mb вне форума  
 
Непрочитано 14.04.2009, 09:28
#3
Кулик Алексей aka kpblc
Moderator

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


Вопрос и ответ отделены от темы http://forum.dwg.ru/showthread.php?p=381776#post381776
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.04.2009, 18:04
#4
Kirzaa


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


Цитата:
Сообщение от nik_mb Посмотреть сообщение
А чем такое не устраивает?
(atof (rtos 0.00000255354 2 7))
А тем что нулей может быть разное количество всегда, но значащих цифирь должно быть 2. (просто глюк и второй пример не ушел)
т.е. 0,00023654
0,074156
0,000000000000000006875345735
0,54669
и т.п. вообщем колличество нолей может быть разное, впереди.
Kirzaa вне форума  
 
Непрочитано 14.04.2009, 20:49
#5
nik_mb

конструктор
 
Регистрация: 23.03.2009
Волгоград
Сообщений: 120


Такая задача потруднее. Вот сочинил код, может быть не самый рациональный и короткий. Ввиде команды "okr_chi"
Код:
[Выделить все]
 
(defun c:okr_chi ()
  (setq chis (getreal "Введи число:  "))
  (setq Txt_chis (rtos chis 2 50)
 ltxt  (strlen Txt_chis)
  )
  (if (= "E" (substr txt_chis (- ltxt 3) 1))
    ;; если число длинное
    ;; и автокад представляет его через степень 10
    (progn ;; тогда, умножаем на степень, округляем и делим
    (setq zn_cif (substr txt_chis (1- ltxt) 2)
   mnojit (atof (strcat "1.0e+" zn_cif))
    )
    (setq chis_p (* chis mnojit))
    (setq chis_o (/ (atof (rtos chis_p 2 1)) mnojit))
    )
    (progn ;; иначе
    (setq poisk T
   no 1
   met1 nil
   met2 nil
    )
    (while poisk
      ;; ищем после точки число не равное 0
      (setq simvl (substr Txt_chis no 1))
      (if (and met1 (/= simvl "0"))
        (setq met2 no
       poisk nil
        )
      )
      (if (= simvl ".")
        (setq met1 no)
      )
      (if (> no 50)
        (setq poisk nil)
      )
      (setq no (1+ no))
    )
    ;;end while
    (setq chis_o (atof (rtos chis 2 (1+ (- met2 met1)))))
    ;; преобразуем по меткам
    )
  )
  ;;end progn & if
  (princ chis)
  (princ "\n")
  ;; старое
  (princ chis_o)
  (princ)
  ;; новое число
)
Длинное число типа 0.000000000000000006875345735 (придется вводить точку в качестве разделителя) будет представлено как 6.9e-018
nik_mb вне форума  
 
Непрочитано 14.04.2009, 21:10
#6
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


А может просто выбрать другие еденицы измерения, чтоб нулей было в разумных пределах и округлять всегда одинаково?

>>0,000000000000000006875345735
пользователю придется напречся, чтоб посчитать тут нули
zamtmn вне форума  
 
Непрочитано 14.04.2009, 22:30
#7
nik_mb

конструктор
 
Регистрация: 23.03.2009
Волгоград
Сообщений: 120


Цитата:
Сообщение от zamtmn Посмотреть сообщение
А может просто выбрать другие еденицы измерения, чтоб нулей было в разумных пределах и округлять всегда одинаково?

>>0,000000000000000006875345735
пользователю придется напречся, чтоб посчитать тут нули
Неизвестно для каких целей эти разные числа. Возможно их никто не вводит, а считываются некие данные, далее идет пересчет чего-то. Но если Kirzaa собирается встроить такое округление в какую-то свою программу, то надо уметь програмировать. А умея програмировать, не сильно напрягаясь, можно сочинить код по "плавающему" округлению аналогично приведенному мною ранее. Хотя, возможно, ожидалось более простое решение.
nik_mb вне форума  
 
Непрочитано 14.04.2009, 23:07
#8
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Округление помоему кроме как для вывода аользователю ненужно.
0,000000000000000006875345735 - это ноль если конечно не мего-гиго... чтонибудь.
мешать в одном месте числа различающиеся на 17 порядков - ни к чему кроме накопления ошибки не приведет
zamtmn вне форума  
 
Непрочитано 15.04.2009, 10:00
#9
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Кстати, по поводу точности представления чисел в Автокаде и ограничений можно почитать еще здесь
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 16.04.2009, 03:30
#10
Kirzaa


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


Господа! Спасибо что откликнулись. Неожидал конечно что это приведет к такому спору. Пример с большим количеством нулей я привел просто для сравнения. Число получается в результате вычислений, поэтому никто такого вводить руками не будет.)
Но спасибо, что обратили на это внимание, я бы и не подумал что может быть настолько все запущено, и исходил из расчета 2-5 нулей.
Спасибо всем!))))))
Kirzaa вне форума  
 
Непрочитано 16.04.2009, 10:59
#11
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Kirzaa,
Цитата:
Пример с большим количеством нулей я привел просто для сравнения
Тогда можно так
Код:
[Выделить все]
(defun okr ( number precision / str i is)
  ;;; number - число (не 0)
  ;;; precision - количество значащих цифр
  ;;; пример
  ;;; (okr 234.00000234 2)
  ;;; (okr 0.007869 3)
  (vl-load-com)
  (if (zerop number) "0"
    (progn
      (setq str (rtos (float number) 2 15)
	    is (1+ (vl-string-search "." str))
	    i (1+ is)
	    )
      (while (= (substr str i 1) "0")
	(setq i (1+ i)))
      (setq i (+ (- i is 1) precision))
      (rtos number 2 i)
      )
    )
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Построение функции округления

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать функции (getkword) Список ключевых слов из списка? Kostinok Программирование 31 31.05.2012 13:08
Предложение: Готовые функции Apelsinov Библиотека функций 170 27.06.2010 23:51
Функции AutoLISP из ... DLL! Supermax LISP 21 27.06.2010 14:18
Странности функции rtos FWA Программирование 2 16.02.2005 11:37