Tóm Tắt
Hướng dẫn giải quyết bài toán
Nhìn trên dãy khai triển trên ta có thể thấy chúng có cùng một công thức chính là
Vậy tất cả chúng ta sẽ viết một hàm tính lũy thừa và một hàm tính giai thừa là gần như đã xử lý được bài toán trên .
Xây dựng hàm tính giai thừa
Code tham khảo:
01234567 |
floatgiaiThua(intn){ intgiaithua=1; for(inti=1;i<=n;i++) giaithua *=i; return(float)giaithua; } |
Xây dựng hàm tính lũy thừa
Code tìm hiểu thêm :
01234567 |
floatluyThua(intn,intk){ intpow=1; for(inti=1;i<=k;i++) pow *=n; return(float)pow; } |
Giải quyết bài toán tính e mũ x
Xây dựng hàm tính e mũ x theo dãy khai triển
Ở phía trên tất cả chúng ta đã viết hai hàm đó là hàm tính giai thừa và hàm tính lũy thừa rồi phải không nào !
Bây giờ trách nhiệm còn lại là tính e mũ x theo dãy khai triển trên mà thôi. Ta sẽ sử dụng một vòng lặp while để tính e mũ x như sau :
- Khởi tạo một giá trị sum bằng 0.
- Nếu xn / n! > ε thì ta cộng giá trị sum cho xn / n!
- Quá trình sẽ lặp đi lặp lại đến khi điều kiện trên sai( tức là sai số không quá lớn).
- Ta sẽ cho số ε rất nhỏ cỡ 0.0000001 để quá trình tính toán chính xác hơn.
Code tính e mũ x :
012345678910111213141516171819202122232425262728293031323334 |
#include floatluyThua(intn,intk){ intpow=1; for(inti=1;i<=k;i++) pow *=n; return(float)pow; } floatgiaiThua(intn){ intgiaithua=1; for(inti=1;i<=n;i++) giaithua *=i; return(float)giaithua; } floatfun(intx)
{ floatsum=0; inti=0; while(luyThua(x,i)/giaiThua(i)>1 e-10){ sum+=luyThua(x,i)/giaiThua(i); i++; } returnsum; } intmain(){ intx; printf(” Nhap x : “); scanf(” % d “,và x ) ; printf(” e ^ x : % 6 f “,fun(x)); return0; } |
0123 | Nhap x : 1e ^ x : 2.718282 |
Các bạn quan tâm là hai hàm tính lũy thừa và giai thừa của mình đã được ép kiểu về float hết rồi nhé. Nếu những bạn không ép kiểu thì tác dụng sẽ bị sai đấy !
Tối ưu chương trình hơn
Nếu bạn nào để ý thì sẽ nhận ra điều sau:
Vậy nên tất cả chúng ta sẽ chỉ cần dùng một vòng while để tính e mũ x mà thôi. Không cần phải viết hai hàm tính lũy thừa và giai thừa như trên nữa. Hơn nữa với số mũ lớn thì cách này tỏ ra tiêu biểu vượt trội trọn vẹn so với cách ở trên. Độ đúng chuẩn cũng cao hơn những trên, vậy thì tại sao lại không dùng nào ?
Ban đầu mình sẽ khởi tạo một biến sum = 1, i = 1 và một biến temp = x. Sau đó kiểm tra nếu temp > ε thì ta triển khai cộng thêm vào giá trị temp cho sum. Sau đó ta nhân temp với x / i và triển khai tăng giá trị i lên một đơn vị chức năng. Qúa trình cứ lặp đi tái diễn cho đến khi điều kiện kèm theo trong vòng while bị sai .
Code tìm hiểu thêm :
012345678910111213141516171819202122 |
#include floatfun(intx){ floatsum=1; inti=1; floattemp=x; while(temp>1 e-10){ sum+=temp; i++; temp=temp *x/i; } returnsum; } intmain(){ intx; printf(” Nhap x : “); scanf(” % d “,và x ) ; printf(” e ^ x : % 6 f “,fun(x)); return0; } |
0123 | Nhap x : 10e ^ x : 22026.468750 |
Với số mũ lớn như 10 thì độ đúng chuẩn vẫn rất cao !
Bài viết mình đến đây là kết thúc. Cám ơn các bạn đã theo dõi !
Source: https://final-blade.com
Category: Kiến thức Internet