Có một chức năng sin nhanh hơn?


25

Tôi đang làm việc trên thế hệ tiếng ồn 3d perlin. Thư viện C # Math có vẻ như quá mức cần thiết cho những gì tôi cần vì hầu hết các chức năng của nó sử dụng phép nhân đôi. Tôi sử dụng Math.Sin () ở một số nơi để tạo ra tiếng ồn. Có ai biết một chức năng sin nhanh hơn?

Câu trả lời:


32

Bạn có thể sử dụng một parabola để ước lượng giá trị của hàm sin. Điều này có lợi thế là có các gốc ở chính xác -pi / 2 và pi / 2 thường không xảy ra với các xấp xỉ nhanh khác dựa trên TaylorSeries hoặc MaclaurinSeries .

public float Sin(float x)
{
    const float B = 4 / PI;
    const float C = -4 / (PI*PI);

    return -(B * x + C * x * ((x < 0) ? -x : x));
} 

Dưới đây là so sánh với hàm sin thực tế:

văn bản thay thế


3
Đây thực sự là một giải pháp tuyệt vời. Dưới đây là một bài viết tuyệt vời từ devmaster.net mô tả lý do tại sao điều này hoạt động và cung cấp một số chi tiết triển khai: devmaster.net/forums/showthread.php?t=5784
Reverbb

Tôi không biết về C #, nhưng hàm abs () trong hầu hết các môi trường C có thể sẽ nhanh hơn một nhánh (toán tử ?:), Khi được tối ưu hóa.

3
Tôi đã xóa cuộc gọi Math.Abs ​​() vì tôi cho rằng mã này có thể chạy trên Xbox 360 hoặc Windows Phone 7. Trình biên dịch JIT trên Xbox 360 không nội tuyến gì cả. Một cuộc gọi đến Math.Abs ​​() thực sự đắt hơn.
zfedoran


1
@zfedoran Tại sao bạn phủ nhận giá trị trả lại? Nó dường như là một sóng hình sin tiêu cực.
Daniel Pendergast

12

Phạm vi của các giá trị đầu vào cho hàm sin () của bạn là gì? Đối với những gì bạn đang sử dụng nó, có vẻ như chúng có thể bị giới hạn, có nghĩa là bạn có thể tính toán trước các giá trị . Chẳng hạn, nếu bạn làm tròn các giá trị đầu vào ở mức độ gần nhất, thì bạn chỉ có 360 giá trị có thể - chỉ cần tính toán trước chúng và lưu trữ trong một bảng.

Nếu bạn cần nhiều giá trị hơn một chút, hãy nói đến một vị trí thập phân, bạn có thể nội suy từ bảng - Tôi không quen với tiếng ồn perlin , nhưng từ "nhiễu" dường như cho thấy nó không yêu cầu độ chính xác cao. :) (Bạn cũng có thể tạo một bảng lớn hơn, 3600 mục không có nhiều dung lượng).


3
Nếu tốc độ là mối quan tâm số một của bạn và bạn không ngại hy sinh một chút độ chính xác, thì đây là câu trả lời tốt nhất.
Tấn

1
Tôi không biết về "tốt nhất" - Như được hiển thị trong một câu trả lời khác, bạn có thể nhận được một xấp xỉ rất tốt khác trong năm ops + abs (tốc độ phụ thuộc vào vòm / trình biên dịch của bạn, nhưng thường không phân nhánh). Nếu bảng tra cứu không có trong bộ đệm, nó sẽ chậm hơn nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.