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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.