2010-02-27 52 views
9

Tôi đang tìm cách triển khai nhanh hơn hoặc gần đúng các hàm được cung cấp bởi cmath.Thực hiện nhanh/xấp xỉ hàm pow() trong C/C++

tôi cần phải đẩy nhanh tiến độ các chức năng sau

  1. pow(x,y)
  2. exp(z*pow(x,y))

nơi z<0. x là từ (-1.0,1.0) và y là từ (0,0, 5,0)

+3

Bạn đang tìm kiếm một cái gì đó như thế này? http://martin.ankerl.com/2007/10/04/optimized-pow-approximation-for-java-and-c-c/ – Swiss

+6

Giá trị âm của x?!? Nhận thật, người đàn ông! –

+0

@Shakov: Sử dụng trình biên dịch nội tuyến để thực hiện việc này? nhưng, đối với các giá trị âm của z và x .... – t0mm13b

Trả lời

6

Dưới đây là một số approxmiations:

Nếu xấp xỉ trên cho pow là không đủ tốt, bạn vẫn có thể thử thay thế nó bằng hàm mũ, tùy thuộc vào máy và biên dịch của bạn này có thể là nhanh hơn:

  1. x^y = e^(y*ln(x))
  2. Và kết quả: e^(z * x^y) = e^(z * e^(y*ln(x)))

Bí quyết khác là khi một số thông số của công thức không thay đổi thường xuyên. Vì vậy, nếu ví dụ x và y hầu như không đổi, bạn có thể tính trước x^y và sử dụng lại điều này.

3

Giá trị có thể có của x và y là gì? Nếu chúng nằm trong giới hạn hợp lý, việc xây dựng một số bảng tra cứu có thể hữu ích.

+0

Tôi đoán câu hỏi này phù hợp với phần bình luận của câu hỏi gốc. – legends2k

+0

hoàn nguyên phiếu bầu.Tôi nghĩ đó là một câu trả lời hoàn hảo hợp lý. Nếu pow là một nút cổ chai và bạn có độ chính xác yêu cầu xuống đến e-6 thì việc tính toán trước có thể là con đường để đi. Tôi làm điều này rất nhiều và không chỉ với pow. – Martin

1

Tôi khuyên bạn nên thực hiện các thủ tục trong sách "Math Toolkit for Real-Time Programming" bởi Jack W. Crenshaw.

Bạn cũng có thể muốn đăng một số mã để thể hiện cách bạn gọi các chức năng này, vì có thể có một số khả năng tối ưu hóa cao hơn khác không rõ ràng từ mô tả được đưa ra.

Các vấn đề liên quan