Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cách này chưa chắc đã nhanh hơn. Lý do:
    - Sử dụng bảng tra lớn => Xác suất cache-miss cao.
    - Phương pháp sử dụng phép lặp có thể tối ưu để chỉ sử dụng một vài thanh ghi, không cần đụng đến RAM. Nếu chỉ lặp cỡ 7 - 10 lần thì cũng không đến nỗi.
    - Hiện nay đã có nhiều vi xử lý tích hợp sẵn sin, cos instruction. Các trình biên dịch sẽ biết cách để sử dụng nó thay vì thư viện.

    Chém thế thôi. Cái nào nhanh hơn thì còn phải thử nữa.

    View more random threads:


  2. #2
    Cái boss14420 là CORDIC, nhưng chỉ có áp dụng cho sin, cos góc nhỏ dưới 90 độ. Điều mà boss14420 không chú ý là các chip mới hơn đã lại bỏ, như X87 của Intel chẳng hạn (Có lẽ là có nhiều vấn đề, Kevin nghĩ là khó có thể đưa full Taylor vào được nên hiệu quả cũng chả đáng kể gì)

    Chỉ có 1 điều là: nhiều (có thể gọi là đa số) system bây giờ tích hợp sẵn phần tính sin, cos... nên có thể là dư thừa. Xét thế nào thì việc seek bộ nhớ là cực nhanh rồi, ít nhất là nhanh hơn rất nhiều Taylor. (không nhanh thì CPU cũng chả có đủ dữ liệu mà tính..., nên một hệ thống nhanh phải là hệ thống cân bằng [IMG]images/smilies/biggrin.png[/IMG])

  3. #3
    Ngày tham gia
    Dec 2015
    Bài viết
    0

    Thủ thuật tính sin, cos trên kiểu int

    Trong 1 ứng dụng J2ME, mình có đoạn cần dùng phương trình tham số của đường tròn:
    x=a+rcost
    y=b+rsint

    Khi đó mình đã dùng class sau để tính sin, cos với kiểu int.
    Các bạn xem thử.


    Mã:
    public class GeoUtils {     //Tinh sin, cos (don vi la do)    private static int[] sin = {     // Gia tri sin da nhan voi 2^14=16384        0, 285, 571, 857, 1142, 1427, 1712, 1996, 2280, 2563,        2845, 3126, 3406, 3685, 3963, 4240, 4516, 4790, 5062, 5334,        5603, 5871, 6137, 6401, 6663, 6924, 7182, 7438, 7691, 7943,        8191, 8438, 8682, 8923, 9161, 9397, 9630, 9860, 10086, 10310,        10531, 10748, 10963, 11173, 11381, 11585, 11785, 11982, 12175, 12365,        12550, 12732, 12910, 13084, 13254, 13420, 13582, 13740, 13894, 14043,        14188, 14329, 14466, 14598, 14725, 14848, 14967, 15081, 15190, 15295,        15395, 15491, 15582, 15668, 15749, 15825, 15897, 15964, 16025, 16082,        16135, 16182, 16224, 16261, 16294, 16321, 16344, 16361, 16374, 16381,        16384, 16381, 16374, 16361, 16344, 16321, 16294, 16261, 16224, 16182,        16135, 16082, 16025, 15964, 15897, 15825, 15749, 15668, 15582, 15491,        15395, 15295, 15190, 15081, 14967, 14848, 14725, 14598, 14466, 14329,        14188, 14043, 13894, 13740, 13582, 13420, 13254, 13084, 12910, 12732,        12550, 12365, 12175, 11982, 11785, 11585, 11381, 11173, 10963, 10748,        10531, 10310, 10086, 9860, 9630, 9397, 9161, 8923, 8682, 8438,        8191, 7943, 7691, 7438, 7182, 6924, 6663, 6401, 6137, 5871,        5603, 5334, 5062, 4790, 4516, 4240, 3963, 3685, 3406, 3126,        2845, 2563, 2280, 1996, 1712, 1427, 1142, 857, 571, 285,        0    };    private static int[] cos = {     // Gia tri cos da nhan voi 2^14=16384        16384, 16381, 16374, 16361, 16344, 16321, 16294, 16261, 16224, 16182,        16135, 16082, 16025, 15964, 15897, 15825, 15749, 15668, 15582, 15491,        15395, 15295, 15190, 15081, 14967, 14848, 14725, 14598, 14466, 14329,        14188, 14043, 13894, 13740, 13582, 13420, 13254, 13084, 12910, 12732,        12550, 12365, 12175, 11982, 11785, 11585, 11381, 11173, 10963, 10748,        10531, 10310, 10086, 9860, 9630, 9397, 9161, 8923, 8682, 8438,        8192, 7943, 7691, 7438, 7182, 6924, 6663, 6401, 6137, 5871,        5603, 5334, 5062, 4790, 4516, 4240, 3963, 3685, 3406, 3126,        2845, 2563, 2280, 1996, 1712, 1427, 1142, 857, 571, 285,        0, -285, -571, -857, -1142, -1427, -1712, -1996, -2280, -2563,        -2845, -3126, -3406, -3685, -3963, -4240, -4516, -4790, -5062, -5334,        -5603, -5871, -6137, -6401, -6663, -6924, -7182, -7438, -7691, -7943,        -8191, -8438, -8682, -8923, -9161, -9397, -9630, -9860, -10086, -10310,        -10531, -10748, -10963, -11173, -11381, -11585, -11785, -11982, -12175, -12365,        -12550, -12732, -12910, -13084, -13254, -13420, -13582, -13740, -13894, -14043,        -14188, -14329, -14466, -14598, -14725, -14848, -14967, -15081, -15190, -15295,        -15395, -15491, -15582, -15668, -15749, -15825, -15897, -15964, -16025, -16082,        -16135, -16182, -16224, -16261, -16294, -16321, -16344, -16361, -16374, -16381,        -16384    };     public static int sin(int x) {     // Sin la ham le        if (x < 0) {            return (-sin(-x))>>14;        }        if ((x %= 360) <= 180) {            return sin[x]>>14;        } else {            return -sin[360 - x]>>14;        }    }     public static int cos(int x) {     //Cos la ham chan        if (x<0) {            x=-x;        }        if ((x %= 360) <= 180) {            return cos[x]>>14;        } else {            return cos[360 - x]>>14;        }    }}

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Đây là 1 cách làm hay đối với chuyên gia bởi cách tính sẵn này sẽ là lợi thế lớn, nhưng với newbie thì bị cho là 'vớ vẩn'. Nếu làm bài tập mà dùng kiểu này dễ ăn điểm 0. he he

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •