Chuyển đến nội dung
Diễn đàn CADViet
ketxu

[Hỏi]Đố vui với LISP

Các bài được khuyến nghị

Không được sử dụng hàm điều kiện IF (hoặc COND) hoặc dùng LIST tương đương với việc tìm kiếm một công thức "hồi quy": Y(X) và Z(X;Y) chỉ dùng các phép toán căn bản và phép đồng dư để mô tả bản số sau:

 

118347_555555.jpg

 

Tuy nhiên, công việc này gian nan và vất vả quá - có lẽ không khả thi?!!!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Không được sử dụng hàm điều kiện IF (hoặc COND) hoặc dùng LIST tương đương với việc tìm kiếm một công thức "hồi quy": Y(X) và Z(X;Y) chỉ dùng các phép toán căn bản và phép đồng dư để mô tả bản số sau:

...

 

Tuy nhiên, công việc này gian nan và vất vả quá - có lẽ không khả thi?!!!

 

Công thức không dùng list trong hàm con tham khảo trong link đầu đã post ở trên.

Vấn đề chỉ còn là không dùng if trong khi gọi hàm

(thu d

 (if (< m 3) (+ m 12) m)

 (if (< m 3) (1- y) y)

)

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cách đây vài tuần, trên Discovery có chiếu 1 chương trình về 1 đứa bé 12 tuổi tìm thứ trong tuần cho 1 ngày bất kỳ trong thế kỷ 20. Kết quả là đứa bé chỉ đáp sai 1 câu. Mục đích chương trình là giới thiệu về khả năng nghe âm thanh tần số cao của trẻ em mà người lớn không có. Tuy nhiên, khi làm chương trình này,  không rõ Discovery có nghĩ tới việc 1 đứa bé tính nhẩm nhanh có thể cho ra kết quả chính xác hơn hay không?

Vì vậy tôi nghĩ đến 1 câu đố về lisp như sau:

Tìm thứ theo ngày, tháng năm bất kỳ, từ ngày 15 / 10 / 1582 (vì quy tắc năm nhuận của lịch Gregory chỉ đúng từ lúc này trở đi)

(defun C:thu ( / d m y)
    (setq d (getint "\nNhap ngay: ") m (getint "Nhap thang: ") y (getint "Nhap nam: "))
    (strcat "Ngay " (itoa d) " thang " (itoa m)  " nam " (itoa y) " la ngay "
         (nth (thu ...) '("chu nhat" "thu hai" "thu ba" "thu tu" "thu nam" "thu sau" "thu bay")))
)
(defun thu (d m y) ...)
Để đơn giản, xem như user nhập d m y hợp lệ

Yêu cầu: chỉ dùng +, - , * , / và rem trong hàm và gọi hàm "thu"

Không dùng biến phụ, setq, lệnh rẽ nhánh hoặc convert như if, cond, fix ...

2 vote cho lời giải đúng đầu tiên, 1 cho những lời giải sau nếu ngắn hơn các lời giải trước.

 

 

Hàm con đạt y/c của chủ đề thì đc.

Còn hàm chính thì "cho em xin" .

Và đây là lời giải :


(defun C:lich ( / d m y G th )

(setq d (getint "\nNhap ngay: ") m (getint "Nhap thang: ") y (getint "Nhap nam: "))

(If (< m 3) (setq m (+ m 12) y (- y 1)))

(setq G (thu d m y))

(mapcar '(lambda (a B)(if (= G a) (setq th B)))

'(1.0 2.0 3.0 4.0 5.0 6.0 7.0)

'("Chu Nhat" "Thu Hai" "Thu Ba" "Thu Tu" "Thu Nam" "Thu Sau" "Thu Bay"))

(If (> m 12) (setq m (- m 12) y (+ y 1)))

(alert (strcat "\n Ngay " (itoa d) " thang " (itoa m) " nam " (itoa y) " la ngay : " th)))

;============

(defun thu (d m y)

(+ (rem (+ (- d 1) (- (* 2.6 (+ m 1)) (rem (* 2.6 (+ m 1)) 1)) (- (* 5.25 (/ y 100)) (rem (* 5.25 (/ y 100)) 1))

(- (* 1.25 (* 100 (- (/ y 100.0) (/ y 100)))) (rem (* 1.25 (* 100 (- (/ y 100.0) (/ y 100)))) 1))) 7) 1))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hàm con đạt y/c của chủ đề thì đc.

Còn hàm chính thì "cho em xin" .

Và đây là lời giải :


(defun C:lich ( / d m y G th )

(setq d (getint "\nNhap ngay: ") m (getint "Nhap thang: ") y (getint "Nhap nam: "))

(If (< m 3) (setq m (+ m 12) y (- y 1)))

(setq G (thu d m y))

(mapcar '(lambda (a B)(if (= G a) (setq th B)))

'(1.0 2.0 3.0 4.0 5.0 6.0 7.0)

'("Chu Nhat" "Thu Hai" "Thu Ba" "Thu Tu" "Thu Nam" "Thu Sau" "Thu Bay"))

(If (> m 12) (setq m (- m 12) y (+ y 1)))

(alert (strcat "\n Ngay " (itoa d) " thang " (itoa m) " nam " (itoa y) " la ngay : " th)))

;============

(defun thu (d m y)

(+ (rem (+ (- d 1) (- (* 2.6 (+ m 1)) (rem (* 2.6 (+ m 1)) 1)) (- (* 5.25 (/ y 100)) (rem (* 5.25 (/ y 100)) 1))

(- (* 1.25 (* 100 (- (/ y 100.0) (/ y 100)))) (rem (* 1.25 (* 100 (- (/ y 100.0) (/ y 100)))) 1))) 7) 1))

Yêu cầu là chỉ viết trong 2 đoạn: gọi hàm và hàm "thu" giữa 3 dấu chấm.

Trong trang web trên đã có công thức, chỉ cần sửa 1 ít là thành hàm lisp

(defun thu (d m y)

(rem (+ y (/ y 4) (/ y 400) (/ y -100) m m (/ (+ 3 (* m 3)) 5) d 1) 7))

Công thức trên còn có thể rút gọn, nhưng tôi chưa post ở đây

 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chưa ổn.

"Ngay 28 thang 2 nam 2013 la ngay thu hai"

"Ngay 29 thang 2 nam 2013 la ngay thu ba"

"Ngay 30 thang 2 nam 2013 la ngay thu tu"

"Ngay 31 thang 2 nam 2013 la ngay thu nam"

"Ngay 1 thang 3 nam 2013 la ngay thu sau"

"Ngay 28 thang 2 nam 2013 la ngay thu hai"
"Ngay 29 thang 2 nam 2013 la ngay thu ba"
"Ngay 30 thang 2 nam 2013 la ngay thu tu"
"Ngay 31 thang 2 nam 2013 la ngay thu nam"
"Ngay 1 thang 3 nam 2013 la ngay thu sau"
 
"Ngay 28 thang 2 nam 2013 la ngay thu hai"
"Ngay 29 thang 2 nam 2013 la ngay thu ba"
"Ngay 30 thang 2 nam 2013 la ngay thu tu"
"Ngay 31 thang 2 nam 2013 la ngay thu nam"
"Ngay 1 thang 3 nam 2013 la ngay thu sau"
 
"Ngay 28 thang 2 nam 2013 la ngay thu hai"
"Ngay 29 thang 2 nam 2013 la ngay thu ba"
"Ngay 30 thang 2 nam 2013 la ngay thu tu"
"Ngay 31 thang 2 nam 2013 la ngay thu nam"
"Ngay 1 thang 3 nam 2013 la ngay thu sau"

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

Chưa ổn.

"Ngay 28 thang 2 nam 2013 la ngay thu hai"

"Ngay 29 thang 2 nam 2013 la ngay thu ba"

"Ngay 30 thang 2 nam 2013 la ngay thu tu"

"Ngay 31 thang 2 nam 2013 la ngay thu nam"

"Ngay 1 thang 3 nam 2013 la ngay thu sau"

"Ngay 28 thang 2 nam 2013 la ngay thu hai"
"Ngay 29 thang 2 nam 2013 la ngay thu ba"
"Ngay 30 thang 2 nam 2013 la ngay thu tu"
"Ngay 31 thang 2 nam 2013 la ngay thu nam"
"Ngay 1 thang 3 nam 2013 la ngay thu sau"
 
"Ngay 28 thang 2 nam 2013 la ngay thu hai"
"Ngay 29 thang 2 nam 2013 la ngay thu ba"
"Ngay 30 thang 2 nam 2013 la ngay thu tu"
"Ngay 31 thang 2 nam 2013 la ngay thu nam"
"Ngay 1 thang 3 nam 2013 la ngay thu sau"
 
"Ngay 28 thang 2 nam 2013 la ngay thu hai"
"Ngay 29 thang 2 nam 2013 la ngay thu ba"
"Ngay 30 thang 2 nam 2013 la ngay thu tu"
"Ngay 31 thang 2 nam 2013 la ngay thu nam"
"Ngay 1 thang 3 nam 2013 la ngay thu sau"

Sorry là lần đầu mình post đoạn code áp dụng đúng cho hàm chính trên máy mình sau khi đã rút gọn, lúc này mình còn post cả đoạn code rút gọn.

Vì vậy nó sẽ lệch ngày so với thực tế, mình đã sửa lại, chắc bạn copy code trước khi mình sửa và xoá đoạn rút gọn.

Như đã nói ở trên, để đơn giản xem như user nhập ngày tháng năm hợp lệ nên không có đoạn kiểm tra

(mục đích câu đố chỉ là cách dùng các hàm số học)

vì vậy nếu nhập  ngày 29 tháng 2 năm 2013 là không hợp lệ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình nhầm ở chỗ nào nhỉ? Và có cảm giác như không thể chỉ dùng 5 hàm trên?

 

(defun C:thu ( / d m y)
 (setq d (getint "\nNhap ngay: ") m (getint "Nhap thang: ") y (getint "Nhap nam: "))
 (strcat "Ngay " (itoa d) " thang " (itoa m)  " nam " (itoa y) " la ngay "
  (nth (thu d m y) '("chu nhat" "thu hai" "thu ba" "thu tu" "thu nam" "thu sau" "thu bay"))))
(defun thu (d m y)
 (rem (+ y (/ y 4) (/ y 400) (/ y -100) m m (/ (+ 3 (* m 3)) 5) d 1) 7))
;EX: 
;"Ngay 28 thang 2 nam 2013 la ngay thu hai"
;"Ngay 1 thang 3 nam 2013 la ngay thu sau"
 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình nhầm ở chỗ nào nhỉ? Và có cảm giác như không thể chỉ dùng 5 hàm trên?

Bạn quên đọc dòng phía dưới:

với d/m/y là ngày tháng năm với quy ước tháng 1,2 của năm y được xem là tháng 13, 14 của năm y - 1 (chẳng hạn ngày 23/1/1999 được xem là ngày 23/13/1998)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn quên đọc dòng phía dưới:

với d/m/y là ngày tháng năm với quy ước tháng 1,2 của năm y được xem là tháng 13, 14 của năm y - 1 (chẳng hạn ngày 23/1/1999 được xem là ngày 23/13/1998)

Khổ thế! Tôi biết câu trên, nhưng nó nằm ở các web kia chứ không phải nằm trong câu đố. Thành ra lỗi này không phải do tôi, bởi nếu người khác thì họ cứ nhập như thế sẽ sai. Nên chăng bạn đưa dòng trên vào câu đố luôn để người ta khỏi phải đọc những quy ước này ở 1 web khác?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Khổ thế! Tôi biết câu trên, nhưng nó nằm ở các web kia chứ không phải nằm trong câu đố. Thành ra lỗi này không phải do tôi, bởi nếu người khác thì họ cứ nhập như thế sẽ sai. Nên chăng bạn đưa dòng trên vào câu đố luôn để người ta khỏi phải đọc những quy ước này ở 1 web khác?

Thì trong câu đố tôi cũng chỉ ghi là (thu ...) chứ đâu ghi (thu d m y). Lúc đầu cũng để mọi người tự tìm trong web,

nhưng thấy ít ai giải nên tôi đưa luôn hàm con lên luôn để tập trung vào phần gọi hàm mà thôi.

Để đơn giản, câu đố trở thành chỉ dùng +,-,*,/ và rem để khử if trong phần gọi hàm sau

(thu d

 (if (< m 3) (+ m 12) m)

 (if (< m 3) (1- y) y)

)

Sau đó rút gọn cả ở hàm chính và hàm con sao cho càng ngắn càng tốt

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hâm nóng topic bằng một câu đố "lạ" sau đây:

Hàm (alert "Do ai giai duoc cau do nay!") thông thường sẽ làm xuất hiện dialog với message là "Do ai giai duoc cau do nay!".

Hỏi: thay đổi gì trong cad để khi paste hàm trên vào command thì không xuất hiện dialog mà chỉ xuất hiện ở dòng command (tương tự princ)?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Hâm nóng topic bằng một câu đố "lạ" sau đây:

Hàm (alert "Do ai giai duoc cau do nay!") thông thường sẽ làm xuất hiện dialog với message là "Do ai giai duoc cau do nay!".

Hỏi: thay đổi gì trong cad để khi paste hàm trên vào command thì không xuất hiện dialog mà chỉ xuất hiện ở dòng command?

Nếu bit 2 của QAFLAGS set (vd = 4, 5, 6...) thì sẽ không xuất hiện dialog

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Trước khi chuẩn bị nghỉ Tết, mời các bạn tham gia câu đố này cho vui.

Xem lisp dưới đây, dùng để tính tổng của 2 số.

Ví dụ:

Nhap so thu 1: >> bạn nhập là 1.2

Nhap so thu 2: >> bạn nhập là 3.4

Nhap tong so: >> bạn phải nhập là 4.6 - vì 4.6 là tổng của 1.2 và 3.4

Khi đó sẽ có thông báo "Ket qua nay la dung!" - Điều này ai mà không biết - Và làm sao mà sai được.

Hỏi: có lúc nào nó sai không nhỉ? Cho 1 ví dụ.

P/S: để đơn giản chỉ cần nhập các số nho nhỏ thôi, và cũng chỉ cần 1 số lẻ thôi.

Đêm giao thừa mời các bạn đón xem 1 câu đố khác nhé!


(defun C:HA()
 (setq a (getreal "\nNhap so thu 1: "))
 (setq b (getreal "\nNhap so thu 2: "))
 (setq c (getreal "\nNhap tong so: "))
 (if (= (+ a b) c)
  (alert "Ket qua nay la dung!")
  (alert "Ket qua nay la sai!")))
 

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Trước khi chuẩn bị nghỉ Tết, mời các bạn tham gia câu đố này cho vui.

Xem lisp dưới đây, dùng để tính tổng của 2 số.

Ví dụ:

Nhap so thu 1: >> bạn nhập là 1.2

Nhap so thu 2: >> bạn nhập là 3.4

Nhap tong so: >> bạn phải nhập là 4.6 - vì 4.6 là tổng của 1.2 và 3.4

Khi đó sẽ có thông báo "Ket qua nay la dung!" - Điều này ai mà không biết - Và làm sao mà sai được.

Hỏi: có lúc nào nó sai không nhỉ? Cho 1 ví dụ.

P/S: để đơn giản chỉ cần nhập các số nho nhỏ thôi, và cũng chỉ cần 1 số lẻ thôi.

Đêm giao thừa mời các bạn đón xem 1 câu đố khác nhé!

(defun C:HA()
 (setq a (getreal "\nNhap so thu 1: "))
 (setq b (getreal "\nNhap so thu 2: "))
 (setq c (getreal "\nNhap tong so: "))
 (if (= (+ a B) c)
  (alert "Ket qua nay la dung!")
  (alert "Ket qua nay la sai!")))
 

 

Đề không yêu cầu nhập như thế nào và thế là mình có quyền nhập phân số

 

Nhap so thu 1: 1/3

 

Nhap so thu 2: 1/4

 

Nhap tong so: 7/12

 

"SAI RỒI"

Nhap so thu 1: 1/3
 
Nhap so thu 2: 1/4
 
Nhap tong so: 7/12
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Trước khi chuẩn bị nghỉ Tết, mời các bạn tham gia câu đố này cho vui.

Xem lisp dưới đây, dùng để tính tổng của 2 số.

Ví dụ:

Nhap so thu 1: >> bạn nhập là 1.2

Nhap so thu 2: >> bạn nhập là 3.4

Nhap tong so: >> bạn phải nhập là 4.6 - vì 4.6 là tổng của 1.2 và 3.4

Khi đó sẽ có thông báo "Ket qua nay la dung!" - Điều này ai mà không biết - Và làm sao mà sai được.

Hỏi: có lúc nào nó sai không nhỉ? Cho 1 ví dụ.

P/S: để đơn giản chỉ cần nhập các số nho nhỏ thôi, và cũng chỉ cần 1 số lẻ thôi.

Đêm giao thừa mời các bạn đón xem 1 câu đố khác nhé!


(defun C:HA()
 (setq a (getreal "\nNhap so thu 1: "))
 (setq b (getreal "\nNhap so thu 2: "))
 (setq c (getreal "\nNhap tong so: "))
 (if (= (+ a B) c)
  (alert "Ket qua nay la dung!")
  (alert "Ket qua nay la sai!")))
 

1 vd nhỏ theo P/S

a = 0.1, b = 19.8, c = 19.9

Lỗi này tôi đã gặp, tìm hiểu và biết nguyên nhân đã lâu.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1 vd nhỏ theo P/S

a = 0.1, b = 19.8, c = 19.9

Lỗi này tôi đã gặp, tìm hiểu và biết nguyên nhân đã lâu.

 

Nguyên nhân ở biến hệ thống LUNITS

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Vấn đề mà câu đố muốn mang lại là: các bạn đã dẫn chứng được nhưng chưa lý giải rõ tại sao lại như thế, để mọi người biết mà cảnh giác.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Vấn đề mà câu đố muốn mang lại là: các bạn đã dẫn chứng được nhưng chưa lý giải rõ tại sao lại như thế, để mọi người biết mà cảnh giác.

 

1./ Ở Hệ đơn vị khác decimal : (biến hệ thống LUNITS - đã nêu) thì kết quả có thể sẽ sai. Hãy cảnh giác. 

2./ Với số thực thì tránh so sánh bằng hàm = mà hãy dùng hàm equal : vấn đề nhập số thực theo kiểu phân số (số thập phân vô hạn) là 1 minh chứng cho kết quả bị sai

 

HÃY CẢNH GIÁC  :P

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ý 1: chưa đồng ý. Vì có đặt LUNITS bằng 1->5 thì vẫn có thể sai.

Ý 2: các số "rõ mười mươi" như ví dụ của ndtnv vẫn sai, chứ chưa cần phải thập phân vô hạn. Đồng ý equal thì chắc hơn.

Đang chờ ndtnv giải thích tiếp.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Ý 1: chưa đồng ý. Vì có đặt LUNITS bằng 1->5 thì vẫn có thể sai.

Ý 2: các số "rõ mười mươi" như ví dụ của ndtnv vẫn sai, chứ chưa cần phải thập phân vô hạn. Đồng ý equal thì chắc hơn.

Đang chờ ndtnv giải thích tiếp.

 

- Đặt biến LUNITS khác decimal  ví dụ : (setvar "Lunits" 1) là chạy ra kết quả là sai như ví dụ của bác ndtnv

Ví dụ như của bác ndtnv các số "rõ mười mươi" như ví dụ của ndtnv là sai , đâu cần phải nhập đến số thập phân vô hạn .......

Đang chờ bác giải thích vì sao ý 1 : bác chưa đồng ý đây. ......

 

Command: (setvar "Lunits" 1)
1
Command: (defun C:HA()
(_>  (setq a (getreal "\nNhap so thu 1: "))
(_>  (setq b (getreal "\nNhap so thu 2: "))
(_>  (setq c (getreal "\nNhap tong so: "))
(_>  (if (= (+ a B) c)
((_>   (princ "Ket qua nay la dung!")
((_>   (princ "Ket qua nay la sai!")))
C:HA
 
Command: ha
 
Nhap so thu 1: 0.1
 
Nhap so thu 2: 19.8
 
Nhap tong so: 19.9
Ket qua nay la sai!"Ket qua nay la sai!"
 
Command:

Command: (setvar "Lunits" 1)

1

 

Command: 'VLIDE

Command:

Command: (defun C:HA()

(_>  (setq a (getreal "\nNhap so thu 1: "))

(_>  (setq b (getreal "\nNhap so thu 2: "))

(_>  (setq c (getreal "\nNhap tong so: "))

(_>  (if (= (+ a b ) c)

((_>   (princ "Ket qua nay la dung!")

((_>   (princ "Ket qua nay la sai!")))

C:HA

 

Command: ha

 

Nhap so thu 1: 0.1

 

Nhap so thu 2: 19.8

 

Nhap tong so: 19.9

Ket qua nay la sai!"Ket qua nay la sai!"

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có nghĩa là ý tôi thế này: cho dù bác có đặt Lunits là 1, 2, 3, 4, 5 đi nữa thì ví dụ mà bạn ndtnv đưa lên luôn cho kết quả sai, chẳng bao giờ cho kq đúng >> đặt LUNITS là chưa có cơ sở.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Có nghĩa là ý tôi thế này: cho dù bác có đặt Lunits là 1, 2, 3, 4, 5 đi nữa thì ví dụ mà bạn ndtnv đưa lên luôn cho kết quả sai, chẳng bao giờ cho kq đúng >> đặt LUNITS là chưa có cơ sở.

 

Chà, lúc đầu Tue_NV cứ tưởng do biến LUNITS chứ, bản chất của nó vẫn là sai số khi thực hiện phép tính mà thôi bác

Ví dụ : 

 

Command: (setq a (+ 0.1 19.8))

19.9

 

Command: (- a 19.9)

3.55271e-015 -> sai số đây bác 

 

Cho nên khi (= a 19.9) -> sẽ trả về nil

Command: (setq a (+ 0.1 19.8))
19.9

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

1 vd nhỏ theo P/S

a = 0.1, b = 19.8, c = 19.9

Lỗi này tôi đã gặp, tìm hiểu và biết nguyên nhân đã lâu.

@ndtnv: rất cám ơn nếu bạn nêu cái màu đỏ ấy lên. Đó là 1 cách giúp diễn đàn phát triển vậy.

@Tue_NV: câu trả lời rất huề vốn.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Số thực được lưu nhị phân trong máy theo t/c của IEEE (Institute of Electrical and Electronics Engineers: "Viện kỹ nghệ Điện và Điện tử")
tham khảo : http://en.wikipedia.org/wiki/Double-precision_floating-point_format
http://support.microsoft.com/kb/42980/vi-vn

1 số double trong máy chiếm 64 bit gồm:
- 1 bit dấu (sign)
- 11 bit Phần mũ (exponent)
- 52 bit Phần định trị (mantissa)
Vì vậy 1 số thập phân khi lưu trong máy chỉ chính xác nếu:
1. Là số nhị phân hữu hạn (dạng A/B với b=2^n)
2. Phần mantissa ngắn hơn 52 bit
Trường hợp 1: như ở VD trong bài trên, các số a, b, c đều không phải là số nhị phân hữu hạn mặc dù chúng là số thập phân hữu hạn
Trường hợp 2: khi thực hiện các phép toán trên các số chính xác, phần mantissa của kết quả có thể dài hơn 52 bit nên kết quả có thể không còn chính xác.
Test:

(setq a (expt 2 30))
(setq b (/ (- (expt 2 22) 1.) (expt 2 22)))
(setq c (/ (- (expt 2 23) 1.) (expt 2 23)))

(- (- (+ a b ) a) b ) ; = 0
(- (- (+ a c) a) c) ; = 1.19209e-007
  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thử cái này:

 

(defun finditem(item li)
  (setq n -1)
  (vl-remove nil (mapcar '(lambda(x) (setq n(1+ n)) (if (= item x) n nil)) li))
)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×