Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
thiep

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

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

thiep    263

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

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
Doan Van Ha    2.680

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.com/forum/index.php?showtopic=44879

  • 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
thiep    263

Đâ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.com/forum/index.php?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à.

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
phamthanhbinh    3.123

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ề....

  • 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
ketxu    2.653

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é

  • 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
TRUNGNGAMY    91

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.

  • 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

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

Đăng nhập để thực hiện theo  

×