- Bạn test lại xem đúng ko!
Log 2 n = log(n)/log(2)
anh chị ui em cần tính log cơ số 2 của n thì em phải viết thế nào để C làm được anh chị có thể giúp em chút được hông
- Bạn test lại xem đúng ko!
Log 2 n = log(n)/log(2)
hay quá , với cách này ta có thể làm cho bất kỳ log của cơ số nào .
Vậy còn hiện thực hàm log (tức là không được include bất kì thư viện nào)! Anh nào gợi ý cho em với.
tức là bạn muốn xây dựng 1 hàm log cho riêng mình đúng ko nè. Nếu vậy, bạn kiếm quyển toán học cao cấp, trong đó có định lí Mac Laurin cho phép khai triển 1 hàm số thành tổng các đa thức và hầu như quyển sách nào cũng có ví dụ về bài này khai triển ln(1+x). Khi đã có được ln thì việc tính log cơ số bất kỳ là hoàn toàn có thể
Đã được chỉnh sửa lần cuối bởi halohcm : 01-11-2008 lúc 09:37 PM.
Đây là code hiện thực theo cách của sách toán 1. Nhưng chạy rất chậm. Không đạt yêu cầu đặt ra.
Công thức của hàm ln:
ln(1 + x) = x - x^2/2 + x^3/3 -... + (-1)^(n-1)x^n/n
Có ai có phương pháp khác hoặc cải tiến phương pháp này không?PHP Code:double pow(double base,int exp){
double result = 1;
for (int i=0;i<abs(exp);i++)
result *= base;
result = (exp>=0)?result:(double)1/result;
return result;
}
double ln(double n){
double x = n-1;
double result = 0;
for (int i=1;i<=9999;i++){
result += pow(-1,(i+1)%2)*pow(x,i)/i;
}
return result;
}
Tại sao lại cứ phải tính lại hàm mũ của x nhỉ sao không dùng lại của bước trước mà phải dùng lại làm gì. chậm là do hàm pow của bạn gọi nhiều quá.
cải tiến lại như sau:
C Code:
double ln(double n) // viết hàm tính ln (n) { double tong = n-1; double x = tong; int flag = -1; if(n == 1.0) // với các phép so sánh này để chính xác các bạn nên define một giá trị Epsilon để so sánh. { // tu 1 tro xuong return 0; } if(n <= 0.0) return -1; // khong co log nay for(int i=2; i<9999; i++) // tại sao ở đây lại lấy số 9999 nhỉ ???? { tong += (flag*x) / i ; x*=x; // cứ một lần lũy thừa của x lại tăng lên 1. flag*=-1; // thay đổi dấu cho lần lặp tiếp theo } return tong; }
Mình mới code các bạn chạy xem thử sao, nhưng đảm bảo là nhanh hơn code của bạn Beginerchicken
Đã được chỉnh sửa lần cuối bởi zkday2686 : 02-11-2008 lúc 04:28 PM.
Công thức đó chỉ đúng khi n-> vô cực. Đó chính là lý do em lấy số 9999 nhưng như các bạn thấy 9999 vãn chưa đáp ứng được yêu cầu về độ chính xác. phải là một số rất lớn mới okie.
Nhưng em không làm này nữa. Cảm ơn các anh đã quan tâm.