Dường như Martin Ankerl có một vài bài viết về vấn đề này, Optimized Approximative pow() in C/C++ rất độc đáo và có hai phiên bản nhanh, một là như sau:
inline double fastPow(double a, double b) {
union {
double d;
int x[2];
} u = { a };
u.x[1] = (int)(b * (u.x[1] - 1072632447) + 1072632447);
u.x[0] = 0;
return u.d;
}
dựa vào loại punning thông qua một liên minh mà là hành vi không xác định trong C++, từ dự thảo tiêu chuẩn phần 9.5
[class.union]:
đang kết hôn, ít nhất một trong các thành viên dữ liệu tĩnh không có thể là một ctive bất cứ lúc nào, có nghĩa là, giá trị của hầu hết các thành viên dữ liệu không tĩnh có thể được lưu trữ trong một liên minh bất cứ lúc nào. [...]
nhưng hầu hết các trình biên dịch bao gồm gcc support this with well defined behavior:
Việc thực hành đọc từ một thành viên công đoàn khác với thời gian gần đây hầu hết các văn bản (gọi là “type-punning”) là phổ biến. Ngay cả với -fstrict-aliasing, type-punning được phép, với điều kiện bộ nhớ được truy cập thông qua các loại hình công đoàn
nhưng điều này không phải là phổ biến như this article points out và như tôi point out in my answer here sử dụng memcpy
nên tạo mã giống hệt nhau và không gọi không xác định hành vi.
Anh ấy cũng liên kết đến số thứ hai Optimized pow() approximation for Java, C/C++, and C#.
Các bài viết đầu tiên cũng liên kết tới microbenchmarks mình here
Nguồn
2013-05-28 02:03:47
Kinda tùy thuộc vào quyền hạn bạn đang tính - vui lòng hiển thị một số mã và/hoặc mô tả dữ liệu của bạn. – paddy
Phần cứng nhanh hơn phần mềm trong trường hợp chung, đó là loại điểm của 'pow' ... bạn không thể đánh bại nó trừ khi bạn có thể đặt thêm hạn chế về những gì bạn đang làm. – Mehrdad
Bài viết này có thể hữu ích: http://martin.ankerl.com/2012/01/25/optimized-approximative-pow-in-c-and-cpp/ –