Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Hàm sin (math.h) tính như thế nào ?

  1. #1
    Ngày gia nhập
    09 2016
    Bài viết
    1,009

    Mặc định Hàm sin (math.h) tính như thế nào ?

    Hàm sin được tính thế nào trong Math ?

    Khai triển Taylor :
    Công thức toán học Latex

    hay phương pháp nào khác ?

    C Code:
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. double sinCalc(const double X){
    5.     // Calc ?
    6.     return 0;
    7. }
    8.  
    9. int main(){
    10.     double x, y;   
    11.     printf("\ninput x = "); scanf("%lf", &x);
    12.     //
    13.     y = sin(x);
    14.     printf("\n(Math) y = %f", y);
    15.     //
    16.     y = sinCalc(x);
    17.     printf("\n(Calc) y = %f", y);  
    18. }

    Ở đây cần tính chính xác tới 0.00 000 01, (0.0000001) thôi

    Mại dzô, mời vô tham gia !

    Phọt mô xa 2016

  2. #2
    Ngày gia nhập
    01 2014
    Bài viết
    26

    Trích dẫn Nguyên bản được gửi bởi fms17 Xem bài viết
    Hàm sin được tính thế nào trong Math ?

    Khai triển Taylor :
    Công thức toán học Latex

    hay phương pháp nào khác ?

    C Code:
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. double sinCalc(const double X){
    5.     // Calc ?
    6.     return 0;
    7. }
    8.  
    9. int main(){
    10.     double x, y;   
    11.     printf("\ninput x = "); scanf("%lf", &x);
    12.     //
    13.     y = sin(x);
    14.     printf("\n(Math) y = %f", y);
    15.     //
    16.     y = sinCalc(x);
    17.     printf("\n(Calc) y = %f", y);  
    18. }

    Ở đây cần tính chính xác tới 0.00 000 01, (0.0000001) thôi

    Mại dzô, mời vô tham gia !

    Phọt mô xa 2016
    Có thể tham khảo ở đây:

    http://www.tc.umn.edu/~ringx004/sidebar.html

  3. #3
    Ngày gia nhập
    09 2016
    Bài viết
    1,009

    Công thức toán học Latex

    Công thức toán học Latex

    Tính gần đúng:
    Công thức toán học Latex

    C Code:
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. #define EPSILON 0.0000001
    5. #define mAbs(x) x>0?x:-x
    6. double sinCalc(const double x){
    7.     int k = 1;
    8.     double kq = x, tg = x;
    9.  
    10.     //while(kq += tg *= -x*x/(2*k)/(2*k++ + 1), mAbs(tg)> EPSILON);
    11.     do{
    12.         tg *= -x*x/(2*k)/(2*k+1); //P(k) = P(k-1)* df(k)
    13.         kq += tg; //Sin(k) = Sin(k-1) + P(k)    
    14.         k++;
    15.     }
    16.     while(mAbs(tg)> EPSILON);
    17.     //
    18.     return kq;
    19. }
    20.  
    21. int main(){
    22.     double x, y;  
    23.     printf("\ninput x = "); scanf("%lf", &x);
    24.     //
    25.     y = sin(x);
    26.     printf("\n(Math) y = %f", y);
    27.     //
    28.     y = sinCalc(x);
    29.     printf("\n(Calc) y = %f", y);  
    30. }

    Mại dzô, mời vô tham gia !

    Phọt mô xa 2016

  4. #4
    Ngày gia nhập
    09 2016
    Bài viết
    1,009

    Hy vọng đây là bài viết cuối của topic này, sẽ không có cách nào nhanh hơn, tối ưu hon bằng viết bằng asm (viết theo source code pascal)

    C Code:
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. double sinCalc(const double X){
    5.     asm{
    6.         FLD     X
    7.         FSIN
    8.         FWAIT
    9.     }
    10. }
    11.  
    12. int main(){
    13.     double x, y;   
    14.     printf("\ninput x = "); scanf("%lf", &x);
    15.     //
    16.     y = sin(x);
    17.     printf("\n(Math) y = %f", y);
    18.     //
    19.     y = sinCalc(x);
    20.     printf("\n(Calc) y = %f", y);
    21. }

    Phọt mô xa 2016

  5. #5
    Ngày gia nhập
    09 2016
    Bài viết
    1,009

    Tuỳ trình biên dịch, TBD c/c++ khác nhau sử dụng keyword. syntax khác nhau. Code trên viết cho Borland c; nhưng biên dịch với Ms sẽ báo lỗi. Sửa lại

    C++ Code:
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. double sinCalc(const double X){
    5.     __asm{
    6.         FLD     X
    7.         FSIN
    8.         FWAIT
    9.     }
    10. }
    11.  
    12. int main(){
    13.     double x, y;  
    14.     printf("\ninput x = "); scanf("%lf", &x);
    15.     //
    16.     y = sin(x); printf("\n(Math) y = %f", y);
    17.     //
    18.     y = sinCalc(x); printf("\n(Calc) y = %f", y);
    19. }

    Biên dịch với MsC++, cl.exe (cmd mode)
    Cmd Code:
    1. cl SinAsm.cpp
    2. echo test
    3. F:\_Abc_\_Test_\_mGw_Asm>SinAsm
    4.  
    5. input x = 1.2345
    6.  
    7. (Math) y = 0.943983
    8. (Calc) y = 0.943983

    Tương tự cần viết lại để biên dịch với MinGW, gcc hay g++

    Phọt mô xa 2016

  6. #6
    Ngày gia nhập
    08 2017
    Bài viết
    2,916

    Mặc định Hàm sin (math.h) tính như thế nào ?

    Bài viết đáng tham khảo.

  7. #7
    Ngày gia nhập
    08 2017
    Bài viết
    2,916

    Hàm pow (inline assembly)
    Pascal Code:
    1. program Pow;
    2. {$APPTYPE CONSOLE}
    3.  
    4. uses
    5.   SysUtils //, math
    6.   ;
    7. function PowerA(const Base, Exponent: Extended): Extended;
    8. const
    9.   Max  : Double = MaxInt;
    10. var
    11.   IntExp : Integer;
    12. asm
    13.   fld     Exponent
    14.   fld     st             {copy to st(1)}
    15.   fabs                   {abs(exp)}
    16.   fld     Max
    17.   fcompp                 {leave exp in st(0)}
    18.   fstsw   ax
    19.   sahf
    20.   jb      @@RealPower    {exp > MaxInt}
    21.   fld     st             {exp in st(0) and st(1)}
    22.   frndint                {round(exp)}
    23.   fcomp                  {compare exp and round(exp)}
    24.   fstsw   ax
    25.   sahf
    26.   jne     @@RealPower
    27.   fistp   IntExp
    28.   mov     eax, IntExp    {eax=Trunc(Exponent)}
    29.   mov     ecx, eax
    30.   cdq
    31.   fld1                   {Result=1}
    32.   xor     eax, edx
    33.   sub     eax, edx       {abs(exp)}
    34.   jz      @@Exit
    35.   fld     Base
    36.   jmp     @@Entry
    37. @@Loop:
    38.   fmul    st, st         {Base * Base}
    39. @@Entry:
    40.   shr     eax, 1
    41.   jnc     @@Loop
    42.   fmul    st(1), st      {Result * X}
    43.   jnz     @@Loop
    44.   fstp    st
    45.   cmp     ecx, 0
    46.   jge     @@Exit
    47.   fld1
    48.   fdivrp                 {1/Result}
    49.   jmp     @@Exit
    50. @@RealPower:
    51.   fld     Base
    52.   ftst
    53.   fstsw   ax
    54.   sahf
    55.   jz      @@Done
    56.   fldln2
    57.   fxch
    58.   fyl2x
    59.   fxch
    60.   fmulp   st(1), st
    61.   fldl2e
    62.   fmulp   st(1), st
    63.   fld     st(0)
    64.   frndint
    65.   fsub    st(1), st
    66.   fxch    st(1)
    67.   f2xm1
    68.   fld1
    69.   faddp   st(1), st
    70.   fscale
    71. @@Done:
    72.   fstp    st(1)
    73. @@Exit:
    74. end;
    75.  
    76. var x, y, kq : Extended;
    77. begin
    78.   writeln('==== Calc x^y =====');
    79.   write('input x = '); read(x);
    80.   write('and y = '); read(y);
    81.   //
    82.   kq := PowerA(x, y); //Gọi hàm inline assembly
    83.   //
    84.   writeln('resutl, power = ', FormatFloat('#,###', kq)); //định dạng với thousand format
    85.   readln;
    86. end.

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn