Đến nội dung


Hình ảnh
* - - - - 2 Bình chọn

Các lỗi "oái oăm" trong LISP!!!


  • Please log in to reply
59 replies to this topic

#1 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 23 November 2010 - 09:16 AM

Có thể có bạn đã gặp và đã biết, nhưng cũng có thể có bạn chưa biết. Dưới đây là vài lỗi "oái oăm" trong LISP. Cứ ngỡ nó bình thường nhưng đôi lúc nó khiến bạn mất một đống thời gian vì chúng:
1) Hãy thử suy nghĩ xem: (cos (/ pi 2))=0 là đúng hay sai?
2) Cho: (setq a nil). Hãy thử suy nghĩ xem: (< a 100) cho kết quả là gì?
Ai biết thêm thì post lên cho mọi người.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#2 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 23 November 2010 - 10:29 AM

Có thể có bạn đã gặp và đã biết, nhưng cũng có thể có bạn chưa biết. Dưới đây là vài lỗi "oái oăm" trong LISP. Cứ ngỡ nó bình thường nhưng đôi lúc nó khiến bạn mất một đống thời gian vì chúng:
1) Hãy thử suy nghĩ xem: (cos (/ pi 2))=0 là đúng hay sai?
2) Cho: (setq a nil). Hãy thử suy nghĩ xem: (< a 100) cho kết quả là gì?
Ai biết thêm thì post lên cho mọi người.

1. Bản thân pi là một số xấp xỉ vậy nên (cos (/ pi 2)) là một số xấp xỉ là đương nhiên. Nó không thể ra giá trị chính xác bằng 0
2. nil luôn nhỏ hơn mọi số. Cái này ta phải bắt lỗi thôi vì phép so sánh chỉ dùng với cùng một kiểu biến

Còn một số điều khó hiểu nữa (chứ không được coi là lỗi) mà bản thân chúng ta chưa hiểu hết về bản chất của lisp mà thôi
  • 0

#3 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 23 November 2010 - 12:11 PM

Có thể có bạn đã gặp và đã biết, nhưng cũng có thể có bạn chưa biết. Dưới đây là vài lỗi "oái oăm" trong LISP. Cứ ngỡ nó bình thường nhưng đôi lúc nó khiến bạn mất một đống thời gian vì chúng:
1) Hãy thử suy nghĩ xem: (cos (/ pi 2))=0 là đúng hay sai?
2) Cho: (setq a nil). Hãy thử suy nghĩ xem: (< a 100) cho kết quả là gì?
Ai biết thêm thì post lên cho mọi người.


1. Bản thân pi là một số xấp xỉ vậy nên (cos (/ pi 2)) là một số xấp xỉ là đương nhiên. Nó không thể ra giá trị chính xác bằng 0
2. nil luôn nhỏ hơn mọi số. Cái này ta phải bắt lỗi thôi vì phép so sánh chỉ dùng với cùng một kiểu biến

Còn một số điều khó hiểu nữa (chứ không được coi là lỗi) mà bản thân chúng ta chưa hiểu hết về bản chất của lisp mà thôi

oái oăm" trong LISP :

1) (equal (cos (/ pi 2)) 0 0.1) -> T

2) (setq a nil) : (if (numberp a) (< a 100) nil) -> ?
  • 1

#4 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 23 November 2010 - 01:38 PM

1. Bản thân pi là một số xấp xỉ vậy nên (cos (/ pi 2)) là một số xấp xỉ là đương nhiên. Nó không thể ra giá trị chính xác bằng 0
2. nil luôn nhỏ hơn mọi số. Cái này ta phải bắt lỗi thôi vì phép so sánh chỉ dùng với cùng một kiểu biến

Còn một số điều khó hiểu nữa (chứ không được coi là lỗi) mà bản thân chúng ta chưa hiểu hết về bản chất của lisp mà thôi

(cos (/ pi 2)) /= 0
nhưng (sin (/ pi 2) = 1 đấy!
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#5 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 23 November 2010 - 01:40 PM

oái oăm" trong LISP :

1) (equal (cos (/ pi 2)) 0 0.1) -> T

2) (setq a nil) : (if (numberp a) (< a 100) nil) -> ?

(cos (/ pi 2)) = 6.12323e-017 => (equal (cos (/ pi 2)) 0 0.1)->T => chuẩn

(if (numberp a) t nil) -> nil => a không phải là 1 number =>(if (numberp a) (< a 100) nil) -> nil => chuẩn. Tuy nhiên nil đặc biệt ở chỗ có thể so sánh với number và luôn nhỏ hơn anynumber
  • 0

#6 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 23 November 2010 - 01:52 PM

(cos (/ pi 2)) /= 0
nhưng (sin (/ pi 2) = 1 đấy!

Có thể hai hàm sin và cos có cách tính khác nhau vì tan = sin/cos trường hợp này sẽ ra vô cùng mà máy tính thì không có số vô cùng. Chậc, tính toán trên máy tính là tính gần đúng chứ không như tính theo giải tích
  • 0

#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 23 November 2010 - 02:31 PM

(cos (/ pi 2)) /= 0
nhưng (sin (/ pi 2) = 1 đấy!

Theo Tue_NV thì cũng không có gì lạ cả.
Máy tính có lẽ đã định nghĩa hàm cos và sin dưới dạng tổng của 1 chuỗi số vô hạn
Định nghĩa bằng chuỗi
Kết quả của 1 phép tính cộng, chia và lũy thừa.
Sai số là tất nhiên :leluoi:
  • 0

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 23 November 2010 - 03:01 PM

Có thể hai hàm sin và cos có cách tính khác nhau vì tan = sin/cos trường hợp này sẽ ra vô cùng mà máy tính thì không có số vô cùng. Chậc, tính toán trên máy tính là tính gần đúng chứ không như tính theo giải tích

Không phải chỉ LISP tính sin, cos, tan... gần đúng theo hình thức khai triển chuỗi (có lẽ thế) mà Excel... cũng vậy.
Vấn đề đưa ra là nhằm mục đích cảnh báo những "sơ ý chết người" khi sử dụng các hàm đó.
Ví dụ 1: ta viết một đoạn lisp như sau:
(cond ((< a 100) (setq b 1))
((>= a 100) (setq b 2)))
Khi kết quả trả về là b=1 thì ta cứ ngỡ a<100, nhưng đôi lúc a=nil, thành ra chương trình của ta có thể sai bét.
Ví dụ 2: khi ta xét 2 đường thẳng có vuông góc với nhau hay không?
- Nếu xét bằng hàm sin của góc tạo bởi 2 đường thẳng đó thì nó bằng 1, và điều này đúng.
- Nếu xét bằng hàm cos của góc tạo bởi 2 đường thẳng đó thì nó bằng... 6.12303e-017, và điều này nếu không để ý thì dễ suy ra chúng không vuông góc nhau. Mà thực tế là chúng vuông góc nhau.
Điều tôi muốn đưa lên diễn đàn chính là để cảnh báo thôi, vì chúng ta có thể "sơ ý" như trên, mà tôi đã là 1 nạn nhân của cả 2 vấn đề trên.
Mong bạn nào có phát hiện hay thì post lên để mọi người cùng... hưởng lợi.
  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#9 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 23 November 2010 - 03:17 PM

Một ví dụ cơ bản nữa: (/ 10 4) = 2 tức kết quả sẽ ra cùng kiểu với 2 tham số đưa vào (int). Tuy nhiên trường hợp này kết quả sẽ phải là kiểu khác (real) . Vậy nên ít nhất 1 trong 2 tham số phải có cùng kiểu với kết quả ví dụ (/ 10.0 4) = 2.5 . Có thể mở rộng ra thêm nhiều ví dụ khác nữa...
  • 0

#10 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 26 December 2010 - 10:48 PM

Vẽ 1 đường Mline bằng hàm command thì có thể lấy record đối tượng của nó bằng bằng hàm entget.
mình vẽ lại đường Mline đó bằng entmake theo record thu được ở trên thì vẫn vẽ được đối tượng bình thường. nhưng lạ ở chỗ không thể lấy được record của đối tượng mới này dù vẫn thu được ename bằng entsel. kết quả trả về nil.
Cũng không có cách gì để tạo 1 Mline bằng entmake. Kết quả thu luôn là 1 dòng thông báo lỗi. cú thật <_<

(entmakex '((0 . "MLINE")
(100 . "AcDbEntity")
(67 . 0)
(8 . "0")
(100 . "AcDbMline")
(2 . "STANDARD")
(40 . 20.0)
(70 . 0)
(71 . 1)
(72 . 3)
(73 . 2)
(10 -501.575 84.252 0.0)
(210 0.0 0.0 1.0)
(11 -501.575 84.252 0.0)
(12 0.957319 0.289032 0.0)
(13 -0.289032 0.957319 0.0)
(74 . 2)
(41 . 0.0)
(41 . 0.0)
(75 . 0)
(74 . 2)
(41 . -20.0)
(41 . 0.0)
(75 . 0)
(11 972.588 529.329 0.0)
(12 0.310483 -0.950579 0.0)
(13 0.462613 0.88656 0.0)
(74 . 2)
(41 . 0.0)
(41 . 0.0)
(75 . 0)
(74 . 2)
(41 . -27.9716)
(41 . 0.0)
(75 . 0)
(11 1174.77 -89.686 0.0)
(12 0.310483 -0.950579 0.0)
(13 0.950579 0.310483 0.0)
(74 . 2)
(41 . 0.0)
(41 . 0.0)
(75 . 0)
(74 . 2)
(41 . -20.0)
(41 . 0.0)
(75 . 0)))


  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#11 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 27 December 2010 - 08:43 AM

E cop nguyên hàng của bác vào và vẫn thấy ra em Mline đẹp đẽ bác ạ :|
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#12 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 27 December 2010 - 09:27 AM

E cop nguyên hàng của bác vào và vẫn thấy ra em Mline đẹp đẽ bác ạ :|

giờ bạn chạy tiếp cái này sẽ thấy điều lạ lùng (entget(car(entsel)))
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#13 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 27 December 2010 - 10:32 AM

Vâng,e cũng đang thắc mắc ^^
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#14 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 12 May 2011 - 11:11 PM

Mình tiếp tục trở thành nạn nhân của 1 trường hợp cực kỳ oái oăm!
Hay tại mình đã hiểu sai điều gì chăng. có bác nào bị truờng hợp thế này chưa?
Hình đã gửi
Mình có 2 Vector VecT1 và VecT2. Giá trị của chúng đuợc định như trong hình
vậy mà không hiểu sao góc hợp bởi 2 vector đó cứ lớn hơn 0 như vậy. với giá trị 0.95 quy ra độ nó gần 50độ chứ có ít đâu :(
mặt khác, khi mình gõ (angle '(0.25788 0.952772)'(0.25788 0.952772)) vào command thì kết quả trả về 0
  • 0

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#15 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 13 May 2011 - 12:04 AM

E thì đang phân vân không biết làm sao trong lệnh Angle nó lại hiểu được 2 đối số của bác là vectơ nhỉ ^^
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#16 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 13 May 2011 - 12:59 AM

ơh nhỉ. ketxu nói mình mới nhớ ra, lúc này nó là 1 điểm. minh thật ngớ ngẩn quá đi :">
  • 1

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#17 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 13 May 2011 - 07:54 AM

Và đây là lỗi trên Cad 2010 (các phiên bản khác chưa k/tra)

Khi đặt tên biến là n
VD: (setq n 5)
sau khi gọi lệnh (vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "" "_non" pt "")
CAD reset (xóa) biến n thành NIL.

(defun c:test(/ pt)
(setq n 5)
(setq pt (getpoint "\nPick point: "))
(vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "" "_non" pt "")
(if n (princ n) (princ "Gia tri n la NIL"))
(princ))

  • 0

#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5451 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 13 May 2011 - 09:07 AM

Và đây là lỗi trên Cad 2010 (các phiên bản khác chưa k/tra)

Khi đặt tên biến là n
VD: (setq n 5)
sau khi gọi lệnh (vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "" "_non" pt "")
CAD reset (xóa) biến n thành NIL.

(defun c:test(/ pt)
(setq n 5)
(setq pt (getpoint "\nPick point: "))
(vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "" "_non" pt "")
(if n (princ n) (princ "Gia tri n la NIL"))
(princ))

Tôi có kiểm tra trên 2004 và 2007 nhưng không lỗi, còn 2010 chưa cài nên botay.com bác ạ
  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#19 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 13 May 2011 - 09:37 AM

Và đây là lỗi trên Cad 2010 (các phiên bản khác chưa k/tra)

Khi đặt tên biến là n
VD: (setq n 5)
sau khi gọi lệnh (vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "" "_non" pt "")
CAD reset (xóa) biến n thành NIL.

(defun c:test(/ pt)
(setq n 5)
(setq pt (getpoint "\nPick point: "))
(vl-cmdf "_.-boundary" "_A" "_I" "_N" "" "" "_non" pt "")
(if n (princ n) (princ "Gia tri n la NIL"))
(princ))

- E đã kiểm tra trên cad 07,08 và 12 thì không có lỗi trên
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#20 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 13 May 2011 - 11:03 AM

Tôi có kiểm tra trên 2004 và 2007 nhưng không lỗi, còn 2010 chưa cài nên botay.com bác ạ

- E đã kiểm tra trên cad 07,08 và 12 thì không có lỗi trên

Cám ơn các bạn.
Như vậy chỉ Cad 2010 bị lỗi này ?
Hay Win của tui bị lỗi ? (XP SP3)
  • 0