LINUX.ORG.RU

Ltk не могу понять, что не работает

 


0

1
(progn 
;;=========Для расчёта геометрии четырёхзвенного механизма==============
  (defvar *L1*)  ;;стойка, мм
  (defvar *L2*)   ;;кривошип, мм
  (defvar *L3*)  ;;шатун, мм
  (defvar *L4*)   ;;коромысло, мм
  (defvar *step*) ;;шаг угла поворота, рад  
  (defvar *tmp-lst-of-val-PHI2*) 
  (defvar *lst-of-val-PHI2*) ;; Лист углов кривошипа φ2 за один оборот
  (defvar *tmp-val-PHI2*)       ;; угол 0рад в листе отсутсвует
  (defvar *lst-of-angles-tg-PHIs*) ;;лист значений тангенса угла tg(PHIs)
  (defvar *lst-val-PHIs*) ;;Лист значений угла PHIs
  (defvar *lst-of-vector-s*) ;;лист значений вектора s
  (defvar *lst-val-PHI4s*) ;;лист значений PHI4s
  (defvar *lst-val-PHI3s*)  ;;лист значений PHI3s
  (defvar *lst-val-PHI4*)  ;;Лист значений углов PHI4 рад
  (defvar *lst-val-PHI3*)  ;;лист значений углов PHI3 рад
  (defvar *count-max*) ;;счёт листа начинается с 0.
  (defvar *count-min*)
  
  (setq *tmp-lst-of-val-PHI2* nil) 
  (setq *lst-of-val-PHI2* nil);; Лист углов кривошипа φ2 за один оборот
  (setq *tmp-val-PHI2* 0.0)       ;; угол 0рад в листе отсутсвует
  (setq *lst-of-angles-tg-PHIs* nil) ;;лист значений тангенса угла tg(PHIs)
  (setq *lst-val-PHIs* nil) ;;Лист значений угла PHIs
  (setq *lst-of-vector-s* nil) ;;лист значений вектора s
  (setq *lst-val-PHI4s* nil) ;;лист значений PHI4s
  (setq *lst-val-PHI3s* nil)  ;;лист значений PHI3s
  (setq *lst-val-PHI4* nil)  ;;Лист значений углов PHI4 рад
  (setq *lst-val-PHI3* nil)  ;;лист значений углов PHI3 рад
  (setq *count-max* 0) ;;счёт листа начинается с 0.
  (setq *count-min* 0))
  ;;;============ввод данных=======================
  ;;; Проверка на число
  (defun string-to-number (n)
    (car (list (read-from-string n))))

  (defun alarm ()
    (do-msg "Введите число"))
  
(with-ltk ()
  (let* ((window (make-instance 'frame))
    #-:tk84
    ;;стойка, мм
    (base (make-instance 'label :master window
			        :text "Стойка: "))
    (e-base (make-instance 'entry :master window))
    (base-units (make-instance 'label :master window
			              :text "мм"))
  ;;кривошип, мм
  (crank (make-instance 'label :master window
		              :text "Кривошип: "))
  (e-crank (make-instance 'entry :master window))
  (crank-units (make-instance 'label :master window
			             :text "мм"))
  ;;шатун, мм
  (bar (make-instance 'label :master window
		      :text "Шатун: "))
  (e-bar (make-instance 'entry :master window))
  (bar-units (make-instance 'label :master window
			    :text "мм"))
  ;;коромысло, мм
  (beam (make-instance 'label :master window
		       :text "Коромысло: "))
  (e-beam (make-instance 'entry window))
  (beam-units (make-instance 'label :master window
			     :text "мм"))
 

  (divide-step (make-instance 'label :master window
		       :text "Шаг разбивки окружности: "))
  (e-divide-step (make-instance 'entry window))
  (divide-step-units (make-instance 'label :master window
				    :text "рад"))

  (b1 (make-instance 'button
		     :master window
		     :text "Поехали"
		     :command (lambda ()
				(progn
				  ;;стойка, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L1* (string-to-number
						      (text e-base)))
					     (alarm))

				  ;;кривошип, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L2* (string-to-number
						      (text e-crank)))
					     (alarm))

				  ;;шатун, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L3* (string-to-number
						      (text e-bar)))
					     (alarm))

				  ;;коромысло, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L4* (string-to-number
						      (text e-beam)))
					     (alarm))
				  
				  ;;Шаг разбивки окружности
				  (if (numberp (string-to-number
						       (text e-divide-step)))
				      (setf *step*
					       (string-to-number
						      (text e-divide-step)))
					     (alarm)))))))
    (pack window)
    (pack base)
    (pack e-base)
    (pack base-units)
    (pack crank)
    (pack e-crank)
    (pack crank-units)
    (pack bar)
    (pack e-bar)
    (pack bar-units)
    (pack beam)
    (pack e-beam)
    (pack beam-units)
    (pack divide-step)
    (pack e-divide-step)
    (pack divide-step-units)
    (pack b1)))

Не могу понять где у ошибки ноги растут?

keyword argument not a symbol: #<FRAME {10055CA4E3}>. [Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]

и вот ещё

; in: WITH-LTK () ; (MAKE-INSTANCE 'LTK:ENTRY LTK::WIN) ; ; caught STYLE-WARNING: ; The function has an odd number of arguments in the keyword portion. ; ; caught STYLE-WARNING: ; The function has an odd number of arguments in the keyword portion. ; ; compilation unit finished ; caught 2 STYLE-WARNING conditions

★★

Последнее исправление: saufesma (всего исправлений: 2)

Ошибку нашел


(progn 
;;=========Для расчёта геометрии четырёхзвенного механизма==============
  (defvar *L1*)  ;;стойка, мм
  (defvar *L2*)   ;;кривошип, мм
  (defvar *L3*)  ;;шатун, мм
  (defvar *L4*)   ;;коромысло, мм
  (defvar *step*) ;;шаг угла поворота, рад  
  (defvar *tmp-lst-of-val-PHI2*) 
  (defvar *lst-of-val-PHI2*) ;; Лист углов кривошипа φ2 за один оборот
  (defvar *tmp-val-PHI2*)       ;; угол 0рад в листе отсутсвует
  (defvar *lst-of-angles-tg-PHIs*) ;;лист значений тангенса угла tg(PHIs)
  (defvar *lst-val-PHIs*) ;;Лист значений угла PHIs
  (defvar *lst-of-vector-s*) ;;лист значений вектора s
  (defvar *lst-val-PHI4s*) ;;лист значений PHI4s
  (defvar *lst-val-PHI3s*)  ;;лист значений PHI3s
  (defvar *lst-val-PHI4*)  ;;Лист значений углов PHI4 рад
  (defvar *lst-val-PHI3*)  ;;лист значений углов PHI3 рад
  (defvar *count-max*) ;;счёт листа начинается с 0.
  (defvar *count-min*)
  
  (setq *tmp-lst-of-val-PHI2* nil) 
  (setq *lst-of-val-PHI2* nil);; Лист углов кривошипа φ2 за один оборот
  (setq *tmp-val-PHI2* 0.0)       ;; угол 0рад в листе отсутсвует
  (setq *lst-of-angles-tg-PHIs* nil) ;;лист значений тангенса угла tg(PHIs)
  (setq *lst-val-PHIs* nil) ;;Лист значений угла PHIs
  (setq *lst-of-vector-s* nil) ;;лист значений вектора s
  (setq *lst-val-PHI4s* nil) ;;лист значений PHI4s
  (setq *lst-val-PHI3s* nil)  ;;лист значений PHI3s
  (setq *lst-val-PHI4* nil)  ;;Лист значений углов PHI4 рад
  (setq *lst-val-PHI3* nil)  ;;лист значений углов PHI3 рад
  (setq *count-max* 0) ;;счёт листа начинается с 0.
  (setq *count-min* 0))
  ;;;============ввод данных=======================
  ;;; Проверка на число
  (defun string-to-number (n)
    (car (list (read-from-string n))))

  (defun alarm ()
    (do-msg "Введите число"))
  
(with-ltk ()
  (let* ((win (make-instance 'frame))
    #-:tk84
    ;;стойка, мм
	 (base (make-instance 'label
			      :master win
			      :text "Стойка: "))
	 (e-base (make-instance 'entry
				:master win))
	 (base-units (make-instance 'label
				    :master win
			            :text "мм"))
  ;;кривошип, мм
	 (crank (make-instance 'label
			       :master win
		               :text "Кривошип: "))
	 (e-crank (make-instance 'entry
				 :master win))
	 (crank-units (make-instance 'label
				     :master win
			             :text "мм"))
  ;;шатун, мм
	 (bar (make-instance 'label
			     :master win
		             :text "Шатун: "))
	 (e-bar (make-instance 'entry
			       :master win))
	 (bar-units (make-instance 'label
				   :master win
			           :text "мм"))
  ;;коромысло, мм
	 (beam (make-instance 'label
			      :master win
		              :text "Коромысло: "))
	 (e-beam (make-instance 'entry
				:master win))
	 (beam-units (make-instance 'label
				    :master win
			            :text "мм"))
 

	 (divide-step (make-instance 'label
				     :master win
		                     :text "Шаг разбивки окружности: "))
	 (e-divide-step (make-instance 'entry
				       :master win))
	 (divide-step-units (make-instance 'label
					   :master win
				           :text "рад"))

  (b1 (make-instance 'button
		     :master win
		     :text "Поехали"
		     :command (lambda ()
				(progn
				  ;;стойка, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L1* (string-to-number
						      (text e-base)))
					     (alarm))

				  ;;кривошип, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L2* (string-to-number
						      (text e-crank)))
					     (alarm))

				  ;;шатун, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L3* (string-to-number
						      (text e-bar)))
					     (alarm))

				  ;;коромысло, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L4* (string-to-number
						      (text e-beam)))
					     (alarm))
				  
				  ;;Шаг разбивки окружности
				  (if (numberp (string-to-number
						       (text e-divide-step)))
				      (setf *step*
					       (string-to-number
						      (text e-divide-step)))
					     (alarm)))))))
    (pack win)
    (pack base :side :left)
    (pack e-base :side :left)
    (pack base-units :side :left)
    (pack crank :side :left)
    (pack e-crank :side :left)
    (pack crank-units :side :left)
    (pack bar :side :left)
    (pack e-bar :side :left)
    (pack bar-units :side :left)
    (pack beam :side :left)
    (pack e-beam :side :left)
    (pack beam-units :side :left)
    (pack divide-step :side :left)
    (pack e-divide-step :side :left)
    (pack divide-step-units :side :left)
    (pack b1 :side :bottom)))

Теперь не могу понять как сделать чтобы каждый lable entry label были одна под другой.

saufesma ★★
() автор топика

Жизненный опыт показывает, что свою голову никому не приделаешь, но вот тебе мой совет - не используй ltk. Напиши клиент-серверное приложение. Лисп будет сервером, wish - клиентом. Данные передавай через сокеты. Т.е., графическую часть пиши прямо на tcl/tk. tcl/tk - это тоже лисп, и в некоторых отношениях он горадо лисповее, чем CL. Есть ряд серьёзных причин так делать, но поскольку до сих пор ни один человек меня не послушал, то я даже не возьму на себя труд их перечислять :) Во всяком случае, я таким способом написал свою IDE для лиспа, https://www.youtube.com/watch?v=1f4QRS0d8NU&t=3s . На ltk я бы никогда этого бы не смог сделать, тоже по ряду причин, которые я перечислять поленюсь.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

Ой ладно тебе. Для простеньких диалогов ltk вполне себе хватает. Судя по запросам ТС'а ему больше и не нужно. Зачем ради этого клиент-серверный каскад велосипедить?

ados ★★★★★
()
Ответ на: комментарий от den73

Жизненный опыт показывает, что свою голову никому не приделаешь, но вот тебе мой совет - не используй ltk. Напиши клиент-серверное приложение.

Спасибо за совет, но сам же видишь я не програмист и для меня клиент сервер просто слишком круто, хотя интересно. Меня интересует результат исследования четырёхзвенного механизма а не само программирование. И самое основное tcl [expr 1.2/0.1] выдаст 11.9999999, а мне нужно 12, а то потом я просто потеряюсь и всё пойдёт на смарку. Я использую cos() sin() так, что голова кругом а в tcl с этими функциями не всё в порядке, математически, что меня не устраивает по тем же причинам.

saufesma ★★
() автор топика
Ответ на: комментарий от monk

фреймы надо делать


(progn 
;;=========Для расчёта геометрии четырёхзвенного механизма==============
  (defvar *L1*)  ;;стойка, мм
  (defvar *L2*)   ;;кривошип, мм
  (defvar *L3*)  ;;шатун, мм
  (defvar *L4*)   ;;коромысло, мм
  (defvar *step*) ;;шаг угла поворота, рад  
  (defvar *tmp-lst-of-val-PHI2*) 
  (defvar *lst-of-val-PHI2*) ;; Лист углов кривошипа φ2 за один оборот
  (defvar *tmp-val-PHI2*)       ;; угол 0рад в листе отсутсвует
  (defvar *lst-of-angles-tg-PHIs*) ;;лист значений тангенса угла tg(PHIs)
  (defvar *lst-val-PHIs*) ;;Лист значений угла PHIs
  (defvar *lst-of-vector-s*) ;;лист значений вектора s
  (defvar *lst-val-PHI4s*) ;;лист значений PHI4s
  (defvar *lst-val-PHI3s*)  ;;лист значений PHI3s
  (defvar *lst-val-PHI4*)  ;;Лист значений углов PHI4 рад
  (defvar *lst-val-PHI3*)  ;;лист значений углов PHI3 рад
  (defvar *count-max*) ;;счёт листа начинается с 0.
  (defvar *count-min*)
  
  (setq *tmp-lst-of-val-PHI2* nil) 
  (setq *lst-of-val-PHI2* nil);; Лист углов кривошипа φ2 за один оборот
  (setq *tmp-val-PHI2* 0.0)       ;; угол 0рад в листе отсутсвует
  (setq *lst-of-angles-tg-PHIs* nil) ;;лист значений тангенса угла tg(PHIs)
  (setq *lst-val-PHIs* nil) ;;Лист значений угла PHIs
  (setq *lst-of-vector-s* nil) ;;лист значений вектора s
  (setq *lst-val-PHI4s* nil) ;;лист значений PHI4s
  (setq *lst-val-PHI3s* nil)  ;;лист значений PHI3s
  (setq *lst-val-PHI4* nil)  ;;Лист значений углов PHI4 рад
  (setq *lst-val-PHI3* nil)  ;;лист значений углов PHI3 рад
  (setq *count-max* 0) ;;счёт листа начинается с 0.
  (setq *count-min* 0))
  ;;;============ввод данных=======================
  ;;; Проверка на число
  (defun string-to-number (n)
    (car (list (read-from-string n))))

  (defun alarm ()
    (do-msg "Введите число"))
  
(with-ltk ()
  (let* ((window (make-instance 'frame))
    #-:tk84
	 ;;стойка, мм
	 (fbase (make-instance 'frame :master window))
	 (base (make-instance 'label
			      :master fbase
			      :text "Стойка: "))
	 (e-base (make-instance 'entry
				:master fbase))
	 (base-units (make-instance 'label
				    :master fbase
			            :text "мм"))
	 ;;кривошип, мм
	 (fcrank (make-instance 'frame :master window))
	 (crank (make-instance 'label
			       :master fcrank
		               :text "Кривошип: "))
	 (e-crank (make-instance 'entry
				 :master fcrank))
	 (crank-units (make-instance 'label
				     :master fcrank
			             :text "мм"))
	 ;;шатун, мм
	 (fbar (make-instance 'frame :master window))
	 (bar (make-instance 'label
			     :master fbar
		             :text "Шатун: "))
	 (e-bar (make-instance 'entry
			       :master fbar))
	 (bar-units (make-instance 'label
				   :master fbar
			           :text "мм"))
	 ;;коромысло, мм
	 (fbeam (make-instance 'frame :master window))
	 (beam (make-instance 'label
			      :master fbeam
		              :text "Коромысло: "))
	 (e-beam (make-instance 'entry
				:master fbeam))
	 (beam-units (make-instance 'label
				    :master fbeam
			            :text "мм"))

	 (fdivide-step (make-instance 'frame :master window))
	 (divide-step (make-instance 'label
				     :master fdivide-step
		                     :text "Шаг разбивки окружности: "))
	 (e-divide-step (make-instance 'entry
				       :master fdivide-step))
	 (divide-step-units (make-instance 'label
					   :master fdivide-step
				           :text "рад"))

	 (fb1 (make-instance 'frame :master window))
	 (b1 (make-instance 'button
		     :master fb1
		     :text "Поехали"
		     :command (lambda ()
				(progn
				  ;;стойка, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L1* (string-to-number
						      (text e-base)))
					     (alarm))

				  ;;кривошип, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L2* (string-to-number
						      (text e-crank)))
					     (alarm))

				  ;;шатун, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L3* (string-to-number
						      (text e-bar)))
					     (alarm))

				  ;;коромысло, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L4* (string-to-number
						      (text e-beam)))
					     (alarm))
				  
				  ;;Шаг разбивки окружности
				  (if (numberp (string-to-number
						       (text e-divide-step)))
				      (setf *step*
					       (string-to-number
						      (text e-divide-step)))
					     (alarm)))))))
    (pack window)
    
    (pack fbase :side :top)
    (pack base :side :left)
    (pack e-base :side :left)
    (pack base-units :side :left)
    
    (pack fcrank :side :top)
    (pack crank :side :left)
    (pack e-crank :side :left)
    (pack crank-units :side :left)

    (pack fbar :side :top)
    (pack bar :side :left)
    (pack e-bar :side :left)
    (pack bar-units :side :left)

    (pack fbeam :side :top)
    (pack beam :side :left)
    (pack e-beam :side :left)
    (pack beam-units :side :left)

    (pack fdivide-step :side :top)
    (pack divide-step :side :left)
    (pack e-divide-step :side :left)
    (pack divide-step-units :side :left)

    (pack fb1 :side :top)
    (pack b1 :side :bottom)))

Получилось. Теперь как их сделать типа таблички?

saufesma ★★
() автор топика
Ответ на: комментарий от ados
  ;;; Проверка на число
  (defun string-to-number (n)
    (car (list (read-from-string n))))

  (defun alarm ()
    (do-msg "Введите число"))
  
(with-ltk ()
  (let* ((window (make-instance 'frame))
    #-:tk84
	 ;;стойка, мм
	 (fbase (make-instance 'frame :master window))
	 (base (make-instance 'label
			      :master fbase
			      :width 21
			      :text "Стойка, L1"))
	 (e-base (make-instance 'entry
				:master fbase
				:width 5))
	 (base-units (make-instance 'label
				    :master fbase
			            :text " мм"))
	 ;;кривошип, мм
	 (fcrank (make-instance 'frame :master window))
	 (crank (make-instance 'label
			       :master fcrank
			       :width 21
		               :text "Кривошип, L2"))
	 (e-crank (make-instance 'entry
				 :master fcrank
				 :width 5))
	 (crank-units (make-instance 'label
				     :master fcrank
			             :text " мм"))
	 ;;шатун, мм
	 (fbar (make-instance 'frame :master window))
	 (bar (make-instance 'label
			     :master fbar
			     :width 21
		             :text "Шатун, L3"))
	 (e-bar (make-instance 'entry
			       :master fbar
			       :width 5))
	 (bar-units (make-instance 'label
				   :master fbar
			           :text " мм"))
	 ;;коромысло, мм
	 (fbeam (make-instance 'frame :master window))
	 (beam (make-instance 'label
			      :master fbeam
			      :width 21
		              :text "Коромысло, L4"))
	 (e-beam (make-instance 'entry
				:master fbeam
				:width 5))
	 (beam-units (make-instance 'label
				    :master fbeam
			            :text " мм"))

	 (fdivide-step (make-instance 'frame :master window))
	 (divide-step (make-instance 'label
				     :master fdivide-step
		                     :text "Шаг разбивки окружности "))
	 (e-divide-step (make-instance 'entry
				       :master fdivide-step
				       :width 5))
	 (divide-step-units (make-instance 'label
					   :master fdivide-step
				           :text " рад"))

	 (fb1 (make-instance 'frame :master window))
	 (b1 (make-instance 'button
		     :master fb1
		     :text "Поехали"
		     :command (lambda ()
				(progn
				  ;;стойка, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L1* (string-to-number
						      (text e-base)))
					     (alarm))

				  ;;кривошип, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L2* (string-to-number
						      (text e-crank)))
					     (alarm))

				  ;;шатун, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L3* (string-to-number
						      (text e-bar)))
					     (alarm))

				  ;;коромысло, мм
				  (if (numberp (string-to-number
						       (text e-base)))
					     (setf *L4* (string-to-number
						      (text e-beam)))
					     (alarm))
				  
				  ;;Шаг разбивки окружности
				  (if (numberp (string-to-number
						       (text e-divide-step)))
				      (setf *step*
					       (string-to-number
						      (text e-divide-step)))
					     (alarm)))))))
    (pack window)
    
    (pack fbase :side :top)
    (pack base :side :left)
    (pack e-base :side :left)
    (pack base-units :side :right)
    
    (pack fcrank :side :top)
    (pack crank :side :left)
    (pack e-crank :side :left)
    (pack crank-units :side :right)

    (pack fbar :side :top)
    (pack bar :side :left)
    (pack e-bar :side :left)
    (pack bar-units :side :right)

    (pack fbeam :side :top)
    (pack beam :side :left)
    (pack e-beam :side :left)
    (pack beam-units :side :right)

    (pack fdivide-step :side :top)
    (pack divide-step :side :left)
    (pack e-divide-step :side :left)
    (pack divide-step-units :side :right)

    (pack fb1 :side :top)
    (pack b1 :side :bottom)))

Уже всё получилось с pack ().

saufesma ★★
() автор топика

Если тебя интересует именно результат, а не какое-то сверхнавороченное приложение, то сгенерируй файл команд tcl, рисующих твой график. И непонятно, зачем тебе тогда такие сложные технологии как CL и ltk. Возьми какой-нибудь математический пакет а-ля маткад и нарисуй в нём. Или даже хоть Libre Office Calc.

den73 ★★★★★
()
Ответ на: комментарий от den73

Я рассматривал эти варианты но СL попался ранее, много читал не всё конечно понял, макросы просто жуть. А вот рекурсия просто изумительна.

Если тебя интересует именно результат, а не какое-то сверхнавороченное приложение

А ведь сверхнавороченное приложение пишется ведь тоже ради результата.

saufesma ★★
() автор топика
Ответ на: комментарий от den73

царь?

Когда много расчётов ошибка будет накапливаться и результат уплывёт. А мне по этим расчётам заказывать железо на заводе и на свои деньги. Если конечно для учёбы то там бы я отмазался. Поэтому царь.

saufesma ★★
() автор топика
Ответ на: комментарий от den73

http://программирование-по-русски.рф

Я почитал. При изготовлении Бурана было много сделано в нашей электронике, сейчас где-то выпускается микропроцессор. И на предприятие приезжали господа из Intel, да и Билл Гейц там тоже был во время развала СССР и что-то там стянули. Может стоит попробовать используя наработки по Бурану наш микропроцессор, своять своё, и не важно как это будет называться только чтоб работало. За железо я бы взялся. По тв как-то смотрел передачку где говорилось о нашем академике связанным с работой по электронике на Буран. Так он не раз повторял, что многие западные микропроцессоры являются тупиковой веткой. Нужны свои.

saufesma ★★
() автор топика
Ответ на: комментарий от saufesma

Царь - это известный местный персонаж. Может, ты и не царь, не знаю. Но 11.9999999 = 12 (хотя не скажу точно, в двойных или одинарных плавающих) - тебя это не должно волновать.

den73 ★★★★★
()
Ответ на: комментарий от ados

Наверняка есть, не знаю, никогда не работал в нём с флоатами, или уже не помню.

den73 ★★★★★
()
Ответ на: комментарий от den73

Но 11.9999999 = 12 (хотя не скажу точно, в двойных или одинарных плавающих) - тебя это не должно волновать.

Наш профессор по математике постоянно ругался с программистом по этому поводу. А был он ещё и директором конструкторского бюро. Пока Lisp рулит мозги выворачивать с числами не вижу смысла.

saufesma ★★
() автор топика
Ответ на: комментарий от den73

Царь - это известный местный персонаж. Может, ты и не царь, не знаю. Но 11.9999999 = 12 (хотя не скажу точно, в двойных или одинарных плавающих) - тебя это не должно волновать.

В лиспе есть рациональные числа, поэтому a*b/c = a/c*b. В языках, где вещественные числа представляются только плавающими, получить нормальную арифметику крайне сложно.

monk ★★★★★
()
Ответ на: комментарий от monk

Вот интересно - если в стандарте есть rationalize, то должны быть и генератор простых чисел и разложение на множители если не в стандарте, то в реализациях точно. Нельзя ли пользоваться этими функциями для других целей?

ados ★★★★★
()
Ответ на: комментарий от ados

Почему это? Для rationalize они не нужны:

;;; Algorithm (recursively presented):
;;;   If x is a rational number, return x.
;;;   If x = 0.0, return 0.
;;;   If x < 0.0, return (- (rationalize (- x))).
;;;   If x > 0.0:
;;;     Call (integer-decode-float x). It returns a m,e,s=1 (mantissa,
;;;     exponent, sign).
;;;     If m = 0 or e >= 0: return x = m*2^e.
;;;     Search a rational number between a = (m-1/2)*2^e and b = (m+1/2)*2^e
;;;     with smallest possible numerator and denominator.
;;;     Note 1: If m is a power of 2, we ought to take a = (m-1/4)*2^e.
;;;       But in this case the result will be x itself anyway, regardless of
;;;       the choice of a. Therefore we can simply ignore this case.
;;;     Note 2: At first, we need to consider the closed interval [a,b].
;;;       but since a and b have the denominator 2^(|e|+1) whereas x itself
;;;       has a denominator <= 2^|e|, we can restrict the seach to the open
;;;       interval (a,b).
;;;     So, for given a and b (0 < a < b) we are searching a rational number
;;;     y with a <= y <= b.
;;;     Recursive algorithm fraction_between(a,b):
;;;       c := (ceiling a)
;;;       if c < b
;;;         then return c       ; because a <= c < b, c integer
;;;         else
;;;           ; a is not integer (otherwise we would have had c = a < b)
;;;           k := c-1          ; k = floor(a), k < a < b <= k+1
;;;           return y = k + 1/fraction_between(1/(b-k), 1/(a-k))
;;;                             ; note 1 <= 1/(b-k) < 1/(a-k)
monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.