Đến nội dung


Hình ảnh
- - - - -

[Hỏi] Trường hợp đơn giản nhưng khó hiểu


  • Please log in to reply
5 replies to this topic

#1 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 29 August 2011 - 12:35 PM

Chào các bạn,
Có ai gặp trường hợp này không:
(setq delta (* 10 (- 80.8 78.5)))
lisp trả về delta là 23.0
Tuy nhiên, hàm tiếp theo:
(setq delta (fix delta))
lisp trả về delta là 22 !!!
khó hiểu thật
  • 0

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 August 2011 - 01:30 PM

Chào các bạn,
Có ai gặp trường hợp này không:
(setq delta (* 10 (- 80.8 78.5)))
lisp trả về delta là 23.0
Tuy nhiên, hàm tiếp theo:
(setq delta (fix delta))
lisp trả về delta là 22 !!!
khó hiểu thật

Đây thuộc các lỗi "oái oăm" trong lsp. Mời bạn đọc bài này:
http://www.cadviet.c...showtopic=44879
  • 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.


#3 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 29 August 2011 - 02:08 PM

Đây thuộc các lỗi "oái oăm" trong lsp. Mời bạn đọc bài này:
http://www.cadviet.c...showtopic=44879

Cảm ơn Hà, thì ra thì nhiều người cũng bị lỗi khó hiểu của hàm FIX. Thiep đã khắc phục nó bằng cách trước khi sử dụng nó, hãy nhân thêm số cần fix với 1.00001, cụ thể
(setq delta (* 10 (- 80.8 78.5)))
lisp trả về delta là 23.0
(setq delta (fix delta))
lisp trả về delta là 22, Tuy nhiên:
(setq delta (fix (* 1.00001 delta)))
hoặc
(setq delta (fix (* 10.000001 (- 80.8 78.5))))
lisp trả về delta là 23 !!!
Đôi khi mình phải đánh lừa nó mới được. Khà, khà, khà.
  • 0

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 29 August 2011 - 02:50 PM

Cảm ơn Hà, thì ra thì nhiều người cũng bị lỗi khó hiểu của hàm FIX. Thiep đã khắc phục nó bằng cách trước khi sử dụng nó, hãy nhân thêm số cần fix với 1.00001, cụ thể
(setq delta (* 10 (- 80.8 78.5)))
lisp trả về delta là 23.0
(setq delta (fix delta))
lisp trả về delta là 22, Tuy nhiên:
(setq delta (fix (* 1.00001 delta)))
hoặc
(setq delta (fix (* 10.000001 (- 80.8 78.5))))
lisp trả về delta là 23 !!!
Đôi khi mình phải đánh lừa nó mới được. Khà, khà, khà.

Hề hề hề,
Tại thằng Lisp này nó Trọng Nữ mà khinh Nam đấy các bác ạ. Mình nghiệm thấy rẳng cũng cái hàm như của bác Thiêp, nếu kết quả trả về là số chẵn thì nó đúng mà hễ cứ thừa ra cái ngẩu (số lẻ) là nó cắt cụt luôn. khổ thế, khổ thế.... Kiện nó đi các bác ạ....
Hề hề hề....
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 29 August 2011 - 02:56 PM

Vậy tạm thời bằng lòng với 1 số cách như :

(fix (atof (rtos delta)))
(fix (* delta 1.00001))
(fix (+ delta 1e-8))


P/s : Bác thiep chú ý đặt tên topic theo yêu cầu 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


#6 TRUNGNGAMY

TRUNGNGAMY

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 401 Bài viết
Điểm đánh giá: 91 (tàm tạm)

Đã gửi 05 September 2011 - 06:20 PM

Hề hề hề,
Tại thằng Lisp này nó Trọng Nữ mà khinh Nam đấy các bác ạ. Mình nghiệm thấy rẳng cũng cái hàm như của bác Thiêp, nếu kết quả trả về là số chẵn thì nó đúng mà hễ cứ thừa ra cái ngẩu (số lẻ) là nó cắt cụt luôn. khổ thế, khổ thế.... Kiện nó đi các bác ạ....
Hề hề hề....

Không riêng gì lisp, cả các trình biên dịch như Delphi, C++ cũng có TH như vậy. Vì một số số thực được lưu vào bộ nhớ theo kiểu gần đúng. VD 23.0 đc lưu là 22.999999999. Khi in ra, nó đã làm tròn nên kq vẫn là 23.0; Hàm fix có lẽ truy xuất trực tiếp bộ nhớ lấy ra phần nguyên nên mới thế. Mình cũng kg còn nhớ cơ chế lưu số thực nên cũng kg rõ lắm.
  • 1