-
23-10-2008, 09:59 AM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
[Solved]Vấn đề với dấu phẩy động?
Mọi người giúp mình với, mình có đoạn code sau dùng để tính số pi theo công thức:
Mã:pi = 4 ( 1 - 1/3 + 1/5 - 1/7 + ... )
Mã:double pi(int nterms) { double term,n,temp=1; int i=1; n= power(0.1,nterms); do { term = 1 / (double) (2*i+1); if (i%2==0) temp+=term; else temp-=term; ++i; } while ( term >= n ); return 4*temp;}
Mã:double pi(int nterms) { double arrTemp[MT],n,temp=1,term; int i=1; n= power(0.1,nterms); do { term = 1 / (double) (2*i+1); if (i%2==0) temp+=term; else temp-=term; arrTemp[i]=temp; ++i; } while ( dabs(arrTemp[i-1]-arrTemp[i-2]) >= n*dabs(arrTemp[i-1]+arrTemp[i-2]) ); return 4*temp;}
Mình thử sửa code 2 lại như sau:
Mã:double pi(int nterms) { double arrTemp[MT],n,temp=1,term; int i=1; n= power(0.1,nterms); do { term = 1 / (double) (2*i+1); if (i%2==0) temp+=term; else temp-=term; arrTemp[i]=temp; ++i; } while ( term >= n ); return 4*temp;}
Quên nữa:
Mã:double power(double a, int n) { if (n==1) return a; else return a*power(a, n-1);} double dabs(double a) { if (a >=0) return a; else return -a;}
View more random threads:
- Xin hỗ trợ về nhập xuất file
- %s va %c khác nhau chỗ nào?
- đọc lấy dữ liệu 2 FILE
- Cách tính tổng của 3 số ngẫu nhiên ?
- Hỏi về nhập chuỗi.
- Báo lỗi c2143 thiếu ; trước using namespace std
- Chuyển dữ liệu từ biến về mảng
- Nhờ các bác giúp em mới học lập trình liên kết đơn trong C++
- kiểm tra số hoàn hảo có trong mảng rồi xuất ra
- hướng dẫn loại bỏ ki tu xuống dòng hàm fgets
-
23-10-2008, 10:02 AM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Overhead function call : dabs() [IMG]images/smilies/wink.png[/IMG]
-
23-10-2008, 05:11 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình không ko sử dụng math.h, nên tạo hàm double dabs(double a) để tìm giá trị tuyệt đối
-
24-10-2008, 09:53 AM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cậu post toàn bộ code tính thời gian của cậu lên xem ! Nếu 2 giải thuật giống nhau, code 2 gọi hàm nhiều hơn chắc chắn phải chậm hơn chứ ! Cậu tính thời gian bằng cách nào vậy, post cho tui xem thử !
-
24-10-2008, 10:13 AM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Pó tay, có cái mãng vào nó chạy nhanh hơn T_T, thiệt là tui chưa gặp cái trường hợp nào quái thế này, để tui suy nghĩ kĩ xem sao đã nhé hic hic :
Mã:#include <iostream>#include <cmath>#include <ctime> const int MT = 100; inline double power( double a, int n ) { if( n==1 ) return a; else return a*power( a, n-1 );} inline double dabs( double a ) { if( a >=0 ) return a; else return -a;} double pi2( int nterms ) { double arrTemp[ MT ], n, temp = 1, term; int i = 1; n = power( 0.1, nterms ); do { term = 1 / ( double )( 2*i + 1 ); if( i%2 == 0 ) temp += term; else temp -= term; arrTemp[ i ] = temp; ++i; } while( term >= n ); return 4*temp;} double pi1( int nterms ) { double term, n, temp = 1; int i = 1; n = power( 0.1, nterms ); do { term = 1 / ( double )( 2*i + 1 ); if( i%2 == 0 ) temp += term; else temp -= term; ++i; } while( term >= n ); return 4*temp;} void get_time_run( const char* func_name, double( *function )( int ) ) { double time1 = static_cast< double >( clock() ); std::cout << " Funtion : " << func_name << " "; time1 = time1 / CLOCKS_PER_SEC; /* do a trial function call */ ( *function )( 10 ); /* call clock a second time */ double timedif = ( static_cast< double >( clock() ) / CLOCKS_PER_SEC ) - time1; std::cout << "The elapsed time is " << timedif << "ms ";} int main() { get_time_run( "pi1", pi1 ); get_time_run( "pi2", pi2 ); return 0;}
-
24-10-2008, 05:48 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình thấy lỗi này quá dễ hiểu mà, có gì là rắc rối đâu nhỉ.
Hàm pi2 chạy bị lỗi nên nó break giữa chừng chứ có phải là chạy nhanh hay chậm đâu. Bạn rox_rook chạy xem nó có in ra được thời gian chạy của hàm pi2 không, in ra chết liền.
Còn hàm pi1 chạy đúng và chạy hết nên nó mới tốn chừng đó thời gian.
Xét lỗi ở hàm pi2, hàm pi2 chỉ có thêm mảng double arrTemp[100] và dòng arrTemp[ i ] = temp;. Vậy chắc chắn là do truy cập ngoài mảng rồi.
Mình gợi ý thế, các bạn tự xem tiếp nhé.
@vuanhkhai: cải thiện hàm power thêm nhé [IMG]images/smilies/biggrin.png[/IMG] http://forums.congdongcviet.com/show...09&postcount=6
-
24-10-2008, 05:59 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Lỗi thì chắc phải có, nhưng hình như MATH-INFO chưa xem kĩ rồi, mình cho MT=100000 cũng ko thay đổi gì. Mình ko nghĩ MT lớn như thế mà vẫn xảy ra lỗi truy cập ngoài mảng được [IMG]images/smilies/icon_question.gif[/IMG]
Mã:#include <stdio.h>#include <stdlib.h> #define MT 100000 /* maximum of term*/ double power(double a, int n);double dabs(double a);double pi(int nterms); /* nterms: number of terms in n calculating the approximate value of pi*/ int main(){ printf("%.10lf ", pi(10)); return 0;} double pi(int nterms) { double arrTemp[MT],n,temp=1,term; int i=1; n= power(0.1,nterms); do { term = 1 / (double) (2*i+1); if (i%2==0) temp+=term; else temp-=term; arrTemp[i]=temp; ++i; } while ( term >= n ); return 4*temp;} double power(double a, int n) { if (n==1) return a; else return a*power(a, n-1);} double dabs(double a) { if (a >=0) return a; else return -a;}
-
25-10-2008, 05:42 PM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Hàm pi2 chạy bị lỗi nên nó break giữa chừng chứ có phải là chạy nhanh hay chậm đâu. Bạn rox_rook chạy xem nó có in ra được thời gian chạy của hàm pi2 không, in ra chết liền.
- Cám ơn cậu nhiều, không coi kĩ giải thuật, không ngờ thằng i nó to dữ vậy T_T !
Ngọc Bích xanh bản chất thuộc dòng đá đá hoa (jade). Và cẩm thạch là tên gọi chung của ngọc bích. Vì thực chất chúng thuộc dòng đá đa khoáng được hình thành từ chất Silicat dưới dạng dioxy. Ngọc bích...
Chia sẻ Vòng tay ngọc bích xanh là...