Tôi đã tự hỏi nếu exp()
nhanh hơn tổng quát hơn pow()
. Tôi chạy điểm chuẩn nhanh trên JsPerf http://jsperf.com/pow-vs-exp và nó cho thấy kết quả thú vị đối với tôi.Hiệu suất Pow() so với exp()
Math.exp(logBase * exponent); // fastest
Math.exp(Math.log(base) * exponent); // middle
Math.pow(base, exponent); // slowest
Tôi biết rằng kết quả sẽ thay đổi rất nhiều về kiến trúc và ngôn ngữ nhưng tôi cũng quan tâm đến quan điểm lý thuyết. Là pow(a, b)
được triển khai dưới dạng exp(log(a) * b)
hoặc có cách nào thông minh hơn về cách tính đồng quyền lực "trực tiếp" (trong C++, C# hoặc JavaScript). Có hướng dẫn CPU cho exp, đăng nhập hoặc pow trên một số kiến trúc?
Theo như tôi biết, cả hai exp()
và log()
được tính bằng cách sử dụng một số chuỗi Taylor và khá tốn kém để tính toán. Điều này làm cho tôi tin rằng đối với cơ sở liên tục của quyền lực, mã này
double logBase = log(123.456);
for (int i = 0; i < 1024; ++i) {
exp(logBase * 654.321);
}
là tốt hơn thế này
for (int i = 0; i < 1024; ++i) {
pow(123.456, 654.321);
}
Đó là giả định có đúng không?
Tôi sẽ không ngạc nhiên nếu một trong các tùy chọn đó chính xác hơn đáng kể so với các tùy chọn khác. – delnan
Tôi có biên độ lỗi khoảng 2-5%. Hãy thử chạy thử nghiệm vài lần.Nhưng điểm chuẩn tất nhiên là xa hoàn hảo. Đó là lý do tại sao tôi quan tâm đến lý thuyết đằng sau điều này. Và cũng chính xác là câu hỏi thú vị. – NightElfik
Điều này thực sự sẽ phụ thuộc vào chi tiết triển khai. Câu hỏi của bạn về JavaScript có đặc biệt không? –