The Pedant's Cosine


29

เจ้านายของฉันเพิ่งบอกให้ฉันเขียนฟังก์ชันโคไซน์ เป็นคนที่มีความสามารถทางคณิตศาสตร์ที่ดีจิตใจของฉันคิดในแบบที่เหมาะสมกับซีรีย์เทย์เลอร์ทันที

cos(x) = 1 / 0! - x^2 / 2! + x^4 / 4! - x^6 / 6! + ... + (-1)^k x^(2k) / (2k)! + ...

อย่างไรก็ตามเจ้านายของฉันจู้จี้จุกจิกมาก เขาต้องการที่จะสามารถระบุจำนวนเทย์เลอร์ในการคำนวณได้อย่างแม่นยำ คุณช่วยฉันเขียนฟังก์ชันนี้ได้ไหม

งานของคุณ

รับค่า floating point xจาก0ถึง2 piและจำนวนเต็มบวกnน้อยกว่า100คำนวณผลรวมของnเทอมแรกของอนุกรมเทย์เลอร์ที่กำหนดไว้ด้านบนสำหรับcos(x)แง่ของซีรีส์เทย์เลอร์กล่าวข้างต้นสำหรับ

นี่คือ ดังนั้นรหัสที่สั้นที่สุดจึงชนะ สามารถนำเข้าและส่งออกได้หลายวิธี ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

หมายเหตุ

  • สามารถป้อนข้อมูลในรูปแบบที่เหมาะสมใด ๆ ตราบใดที่มีการแยกชัดเจนระหว่าง xและnและ
  • อินพุตและเอาต์พุตควรเป็นค่าจุดลอยตัวอย่างน้อยความแม่นยำเท่ากับการคำนวณสูตรโดยใช้ตัวเลขทศนิยมลอยตัว IEEE ที่มีความแม่นยำเดียวพร้อมกับกฎการปัดเศษมาตรฐานบางอย่าง
  • หากเหมาะสมกับภาษาที่ใช้การคำนวณอาจทำได้โดยใช้ปริมาณที่แน่นอน แต่อินพุตและเอาต์พุตจะยังคงอยู่ในรูปแบบทศนิยม

ตัวอย่าง

 x  |  n | Output
----+----+--------------
0.0 |  1 | 1.0
0.5 |  1 | 1.0
0.5 |  2 | 0.875
0.5 |  4 | 0.87758246...
0.5 |  9 | 0.87758256...
2.0 |  2 | -1.0
2.0 |  5 | -0.4158730...

1
ฉันสมมติว่านั่นnก็ยิ่งใหญ่กว่าเช่นกัน0?
GamrCorps

8
ฉันจะบอกว่าพวกเขาในทางเทคนิคไม่ใช่สิ่งที่คนอวดรู้หมายถึง แต่นั่นอาจจะเมตาเกินไป
PyRulez

8
หากเจ้านายของคุณต้องการให้คุณเขียนฟังก์ชันที่ดีหรืออย่างน้อยก็สามารถอ่านได้แสดงว่าคุณอยู่ผิดที่
Roman Gräf

2
อย่างแท้จริงเจ้านายจู้จี้จุกจิกต้องการที่จะคำนวณโคไซน์ใช้สิ่งเล็ก ๆ น้อย ๆ ที่มีประสิทธิภาพมากขึ้น (และถูกต้องกว่า) ชุด Taylor ...
PM 2Ring

6
@ PM2Ring นั่นคงไม่จู้จี้จุกจิกนั่นจะสมเหตุสมผล ซีรี่ส์ Taylor เป็นตัวเลือกที่เลวร้ายที่สุด
user1997744

คำตอบ:


64

ภาษาสคริปต์การทำงานของ Flashpoint , 165 157 ไบต์

F={x=_this select 0;n=_this select 1;i=0;r=0;while{i<n*2}do{r=r+x^i/(i call{c=_this;j=c-1;while{j>0}do{c=c*j;j=j-1};if(c<1)then{c=1};c})*(-1)^(i/2);i=i+2};r}

โทรด้วย:

hint format["%1\n%2\n%3\n%4\n%5\n%6\n%7",
    [0.0, 1] call f,
    [0.5, 1] call f,
    [0.5, 2] call f,
    [0.5, 4] call f,
    [0.5, 9] call f,
    [2.0, 2] call f,
    [2.0, 5] call f]

เอาท์พุท:

enter image description here

อินพุตและเอาต์พุตควรเป็นค่าจุดลอยตัวอย่างน้อยความแม่นยำเท่ากับการคำนวณสูตรโดยใช้ตัวเลขทศนิยมลอยตัว IEEE ที่มีความแม่นยำเดียวพร้อมกับกฎการปัดเศษมาตรฐานบางอย่าง

ฉันค่อนข้างแน่ใจว่าตัวเลขนั้นเป็นตัวเลขทศนิยมที่แน่นอนของ IEEE แม้ว่าในผลลัพธ์ที่พิมพ์ออกมาแล้วทศนิยมที่ยาวกว่านั้นก็ไม่แม่นยำ มันคือการพิมพ์ที่ปัดเศษตัวเลขแบบนั้นจริง ๆ แล้วตัวเลขนั้นแม่นยำมากขึ้น

ตัวอย่างเช่นa=1.00001;b=1.000011;hint format["%1\n%2\n%3", a, b, a==b]จะส่งออกสิ่งนี้:

1.00001
1.00001
false

ชัดเจนว่าความแม่นยำที่แท้จริงของตัวเลขนั้นมากกว่าความแม่นยำที่พิมพ์ออกมา



16
@ หรือไม่ทำไมล่ะ
Steadybox

3
@ หรือฉันคิดว่าคำถามที่เหมาะสมกว่าที่จะถามคือ: ทำไมภาษาสคริปต์การทำงานของ Flashpoint จึงไม่แตกต่างจากArnoldC ?
ceilingcat

2
อืม ... คุณป้อนอินพุตโดยถ่ายภาพจำนวนรอบที่กำหนด [n] ไปยังทิศทางเข็มทิศที่กำหนด [x] หรือไม่ 😍การใช้งานจุดวาบไฟ!
Mormegil

14
@Memegil เอาละโดยทั่วไปไม่มี แต่สามารถทำได้ด้วยรหัสชิ้นนี้: dir=-1;num=1;player addEventHandler ["fired", {_dir=getdir (nearestObject [_this select 0, _this select 4]);if (dir < 0) then {dir = _dir} else {if (abs(dir - _dir) < 5) then {num = num + 1} else {hint format["%1", [dir*(pi/180), num] call F];dir=-1;num=1}}}]- การถ่ายภาพไปยังทิศทางที่เพิ่มขึ้นเคาน์เตอร์และจากนั้นการถ่ายภาพไปยังอีกทิศทางหนึ่งเรียกฟังก์ชันโคไซน์ด้วยทิศทางก่อนหน้าและจำนวนภาพในทิศทางนั้น
Steadybox

13

05AB1E , 14 11 ไบต์

FIn(NmN·!/O

ลองออนไลน์!

คำอธิบาย

F                # for N in [0 ... n] do
 In              # push (x^2)
   (             # negate
    Nm           # raise to the Nth power
      N·!        # push (2*N)!
         /       # divide
          O      # sum

@ JamesHolderness: ใช่แล้วภาษาได้ผ่านการยกเครื่องครั้งใหญ่มาแล้ว ข้อผิดพลาดแปลกดูเหมือนจะมีทุกข์แต่ก็สามารถแทนถูกแทนที่ด้วย² I
Emigna

10

MATL , 14 ไบต์

U_iqE:2ep/YpsQ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมดตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบายพร้อมตัวอย่าง

ตัวเลขทั้งหมดมีความแม่นยำสองเท่า (นี่คือค่าเริ่มต้น)

พิจารณาอินพุตx = 2.0, n = 5.

U_     % Implicitly input x. Square and negate
       % STACK: -4
iqE    % Input n. Subtract 1, multiply by 2
       % STACK: -4, 8
:      % Range
       % STACK: -4, [1 2 3 4 5 6 7 8]
2e     % Reshape into a 2-row matrix
       % STACK: -4, [1 3 5 7;
       %             2 4 6 8]
p      % Product of each column
       % STACK: -4, [2 12 30 56]
/      % Divide, element-wise
       % STACK: [-2 -0.333333333333333 -0.133333333333333 -0.0714285714285714]
Yp     % Cumulative product of array
       % STACK: [-2 0.666666666666667 -0.0888888888888889 0.00634920634920635]
s      % Sum of array
       % STACK: -1.41587301587302
Q      % Add 1. Implicitly display
       % STACK: -0.41587301587302

10

Mathematica, 49 41 39 31 ไบต์

Sum[(-#^2)^k/(2k)!,{k,0,#2-1}]&

รุ่นเก่า "สนุก" มากขึ้น: (39 ไบต์)

Normal@Series[Cos@k,{k,0,2#2-2}]/.k->#&

บันทึก 10 ไบต์ด้วย @Pavel และ 8 ขอบคุณไปยัง @Greg Martin!


9
ในขณะที่Seriesความสามารถของ Mathematica นั้นยอดเยี่ยมและสนุกจริงๆมันกลับกลายเป็นว่าการใช้งานด้วยมือSum[(-#^2)^k/(2k)!,{k,0,#2-1}]&จะสั้นลงที่นี่
เกร็กมาร์ติน

9

เจลลี่ , 12 11 ไบต์

ḶḤµ⁹*÷!_2/S

ลองออนไลน์!

อย่างไร?

ḶḤµ⁹*÷!_2/S - Main link: n, x           e.g. 5, 2.0
Ḷ           - lowered range(n)              [0,1,2,3,4]
 Ḥ          - double (vectorises)           [0,2,4,6,8]
  µ         - monadic chain separation (call that i)
   ⁹        - link's right argument         2.0
    *       - exponentiate(i) (vectorises)  [1.0,4.0,16.0,64.0,256.0]
      !     - factorial(i) (vectorises)     [1,  2,  24,  720, 40320]
     ÷      - divide (vectorises)           [1.0,2.0,0.6666666666666666,0.08888888888888889,0.006349206349206349]
        2/  - pairwise reduce by:
       _    -     subtraction               [-1.0,0.5777777777777777,0.006349206349206349]
         S  - sum                           -0.41587301587301617

8

เยลลี่, 22 ไบต์

-*ð×ø⁹*⁸²ð÷ø⁸Ḥ!
⁸R’Ç€S

นี่เป็นโปรแกรมเต็มรูปแบบซึ่งรับ n เป็นอาร์กิวเมนต์แรกและ x เป็นสอง

คำอธิบาย:

              Creates a function to compute each term in the series. 
Its argument we will call k, eg k=3 computes 3rd term. Take x=2 for example.
-*           Computes (-1)^k. Eg -1
ð×ø        Multiplies by the quantity of
⁹             x.  
*             to the power of
⁸             k
²             ...squared. Eg -1 × (2³)² 
ð÷ø        divides by the quantity of
⁸              k
Ḥ             doubled
!               ...factorial. Eg -1 × (2³)²/(6!).


                Main link, first argument n and second argument n. Eg n=4, x=2.
⁸R            Creates range(n). Eg [1,2,3,4]
’                Decrements each element. Eg [0,1,2,3]
Ç€            Maps the above function over each element. Eg [1,-2,0.666,-0.0889]
S               Sum all all of the elements.  Eg -0.422.

7
ยินดีต้อนรับสู่ PPCG!
Martin Ender

6

Python ขนาด 54 ไบต์

f=lambda x,n,t=1,p=1:n and t+f(x,n-1,-t*x*x/p/-~p,p+2)

หากใช้ Python 2 ต้องแน่ใจว่าผ่าน x เป็นทศนิยมไม่ใช่จำนวนเต็ม แต่ฉันเข้าใจว่ามันไม่สำคัญว่าคุณใช้ Python 3 หรือไม่


5

TI-Basic, 41 40 ไบต์

Prompt X,N
sum(seq((-(X+1E-49)2)^Q/((2Q)!),Q,0,N-1
1E-49 ถูกเพิ่มลงในมุมเนื่องจาก TI-Basic ส่งข้อผิดพลาดเป็น 0 ^ 0 มันใหญ่พอที่จะไม่ทำให้เกิดข้อผิดพลาดและมีขนาดไม่ใหญ่พอที่จะเปลี่ยนคำตอบ


4

C, 96 ไบต์

วนเวียน อยู่

f(n){return n?n*f(n-1):1;}float c(n,x)float x;{return n?c(n-1,x)+pow(-1,n)*pow(x,2*n)/f(2*n):1;}

รายละเอียด

f(n) // factorial(n)
{
    return n ?   // n != 0 ?
        n*f(n-1) // n! = n * (n-1)!
    : 1;         // 0! = 1
}

float c(n,x)float x; // cos(x) with n+1 terms
{
    return n ?        // n != 0 ?
        c(n-1, x)     // cos(x) (n-1)th term
        + pow(-1, n)  // + (-1)^n
        * pow(x, 2*n) // * x^(2n)
        / f(2 * n)    // / (2n)!
    : 1;              // cos(x) at n=0
}

Progressive Recursive, 133 ไบต์แบบ สด

#define F float
#define c(x,n) 1+g(1,n,x,1,1,1)
F g(F i,F n,F x,F s,F p,F f){s=-s;p*=x*x;f*=i;return i<n?g(i+1,n,x,s,p,f)+s/2*p/f:0;}

รายละเอียด

#define F float // shorthand float

#define c(x,n) 1+g(1,n,x,1,1,1) // macro function

F g(F i,F n,F x,F s,F p,F f)
{
    s = -s;   // (-1)^n = (-1) * (-1)^(n-1)
    p *= x*x; // x^(2n) =  x^2 * x^(2(n-1))
    f *= i;   //    2n! =    2 * (1*2*..*n)

    return i < n ?       // i = 0 .. n-1
        g(i+1,n,x,s,p,f) // next term
        + s / 2 * p / f  // s*p/2f = s/2*p/f
        : 0;             // don't compute nth term
}

96b version c(0.5, 80)=> NaN สำหรับโอเวอร์f(80)=0
โฟลว์

ฟังก์ชั่นการเรียกซ้ำ @ l4m2 อยู่ที่นี่เพื่อจุดประสงค์ในการเล่นกอล์ฟ แต่ไม่สามารถทำได้เนื่องจากสามารถล้นได้อย่างง่ายดายเนื่องจากจำนวนการโทรเกินขีด จำกัด การโทร - กองซ้อนและแม้จะมีข้อ จำกัด ที่สูงกว่าก็เป็นการสิ้นเปลืองทรัพยากร ตัวเลขขนาดเล็ก
Khaled.K

1
ปัญหาพูดโดยตรงn<100เพื่อให้คุณอย่างน้อยก็อย่าไปไกลขนาดนั้น ไม่ล้นมาก
เกินไป

หากปัญหาพูดn<100และคุณใช้O(2^n)วิธีแก้ปัญหาฉันเดาว่ามันก็โอเคตราบใดที่มันตอบโต้ผลในที่สุด
l4m2

1
FYI, ผลลัพธ์ NaN ไม่ได้เกี่ยวข้องกับการเรียกซ้ำ - มันคือการคำนวณแบบแฟคทอเรียลซึ่งใช้จำนวนเต็มเมื่อมันควรจะใช้แบบลอยตัว (198! จะไม่เข้ากับ int)
James Holderness

4

JavaScript (ES6), 46 ไบต์

f=
x=>g=(n,t=1,p=0)=>n&&t+g(--n,-t*x*x/++p/++p,p)
<div oninput=o.textContent=f(x.value)(n.value)><input id=x><input type=number min=1 value=1 id=n><pre id=o>1

ใช้อินพุต curried (x) (n)


ทำไมไม่ทำให้เป็นตัวอย่าง
อาร์จัน

4

C, 71 ไบต์

ใช้ระบบ Horner

float f(n,x)float x;{float y;for(n+=n;n;)y=1-(y*x*x/n--)/n--;return y;}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

float f(n,x) float x;
{
  float y = 0.0;
  for(n = 2*n; n>0; n -= 2)
  {
    y = 1-y*x*x/n/(n-1);
  }
  return y;
}

แพลตฟอร์มนี้ใช้งานอะไรได้บ้าง
anatolyg

4

R, 70 64 ไบต์

function(x,n)sum(sapply(1:n-1,function(y)(-x^2)^y/gamma(2*y+1)))

บันทึก 6 ไบต์ด้วยคำตอบของpizzapants184ด้วยเคล็ดลับ (-x ^ 2) ^ y

65 ไบต์:

function(x,n)Reduce(function(a,b)a+(-x^2)^b/gamma(2*b+1),1:n-1,0)

การใช้งานที่ไร้เดียงสาของเรื่องนี้ค่อนข้างน้อย แต่ก็เล่นกอล์ฟนิดหน่อย ส่งคืนฟังก์ชันที่ไม่ระบุชื่อที่คำนวณชุด Taylor เป็น n ที่ระบุ

  • การใช้การลดใช้เวลามากกว่าหนึ่งไบต์เป็น initจะต้องมีการตั้งค่าเป็น 0
  • ใช้gamma(n+1)แทนfactorial(n)
  • 1:n-1 เทียบเท่ากับ 0:(n-1)

3

oK , 38 ไบต์

นอกจากนี้ยังใช้งานได้ในkแต่ใช้เวลา39 ไบต์เพราะ'จะต้องเขียน/:แทน (อย่างน้อยใน kmac 2016.06.28

{+/(y#1 -1)*{(*/y#x)%*/1+!y}.'x,'2*!y}

คำอธิบาย:

เริ่มจากตรงกลางกันก่อน คือการยกกำลังก็จะเทียบเท่ากับ(*/y#x) จะเป็นหรือปัจจัย คือการแบ่ง ดังนั้นฟังก์ชั่นที่อยู่ตรงกลางคือx^y*/1+!yy!y%middle(x,y) = (x^y)/(y!)

ตอนนี้บิตทางด้านขวาซึ่งฟังก์ชั่นด้านบนจะถูกนำไปใช้ เป็น2*!y prepends ไปยังรายการในรายการที่ทุกคนหันไป แล้วนำไปใช้เพื่อให้คู่ของตัวเลขทุก ( หลัก){0, 2, 4, ..., 2*(y-1)}x,'x{(x, 0), (x, 2), (x, 4), ..., (x, 2*(y-1))}.'middlemap

สุดท้าย(y#1 -1)*คูณผลลัพธ์ด้วย 1 หรือ -1 (สลับกัน) แล้ว+/หาผลรวม


3

Haskell, 71 ไบต์

f x n=sum$map(\i->(-1)^i*x^(2*i)/fromIntegral(product[1..2*i]))[0..n-1]

นี่เป็นคำตอบที่น่าเบื่อที่ไม่ยากที่จะถอดรหัส fromIntegralจริงๆกัดแม้ว่า ( /ผู้ประกอบการต้องมีตัวถูกดำเนินการในประเภทตัวเลขเดียวกันใน Haskell และไม่อนุญาตให้มีการข่มขู่ระหว่างประเภทที่เป็นตัวเลขหากไม่มีฟังก์ชั่นที่มีคำ)


1
ความเข้าใจในรายการสามารถช่วยให้คุณกัดได้ไม่กี่:f x n=sum[(-1)^i*x^(2*i)/fromIntegral(product[1..2*i])|i<-[0..n-1]]
Julian Wolf

1
ยินดีต้อนรับสู่การเล่น PPCG และ Haskell โดยเฉพาะ!
Laikoni

3

เยลลี่ 12 ไบต์

²N*Ḷ}©÷®Ḥ!¤S

ลองออนไลน์!

มันทำงานอย่างไร

²N*Ḷ}©÷®Ḥ!¤S  Main link. Left argument: x. Right argument: n

²             Square; yield x².
 N            Negate; yield -x².
     ©         Call the link to the left and copy the result to the register.
   Ḷ}          Call unlength on the right argument, yielding [0, 1, ..., n-1].
  *           Yield [1, -x², ..., (-x²)**(n-1)].
          ¤   Combine the three links to the left into a niladic chain.
       ®        Yield the value in the register, [0, 1, ..., n-1].
        Ḥ       Unhalve; yield [0, 2, ..., 2n-2].
         !      Factorial; yield [0!, 2!, ..., (2n-2)!].
      ÷         Division; yield [1/0!, -x²/2!, ..., (-x²)**(n-1)/(2n-2)!].
           S  Take the sum.


3

Haskell , 61 ไบต์

x#n=sum[(-1*x^2)^i/fromIntegral(product[1..2*i])|i<-[0..n-1]]

ดูเหมือนจะแตกต่างจากโซลูชัน Haskell อื่น ๆ เพื่อรับประกันคำตอบแยกต่างหาก การดำเนินการควรจะอธิบายได้ด้วยตนเอง - โทรหาด้วยx#nที่xเป็นจำนวนโคไซน์ซึ่งจะต้องคำนวณและnเป็นลำดับของผลรวมบางส่วนที่จะต้องดำเนินการ


คุณสามารถบันทึกได้ไม่กี่ไบต์โดยการลบfromIntegralและใช้**แทน^เช่นนี้
B. Mehta

x#n=sum[(-x*x)**i/product[1..2*i]|i<-[0..n-1]]บันทึกอีก 3 ไบต์
ลินน์


3

J, 26 24 ไบต์

+/@:(!@]%~^*_1^2%~])2*i.

-2 ไบต์ต้องขอบคุณ @cole

เดิมทีฉันวางแผนจะใช้ gerlic gerund เพื่อสลับระหว่างการบวกและการลบ แต่ไม่สามารถใช้งานได้

คำอธิบาย:

                    2*i.     | Integers from 0 to 2(n-1)
    (              )         | Dyadic train:
            _1^-:@]          | -1 to the power of the left argument
          ^*                 | Times left arg to the power of right arg
     !@]%~                   | Divided by the factorial of the right arg
+/@:                         | Sum

1
24 bytes: +/@:(!@]%~^*_1^2%~])2*i.จะตรวจสอบ gerund ที่เป็นวงรอบ: มันอาจล้มเหลวเนื่องจาก J ประเมินค่าจาก/ขวาไปซ้ายดังนั้นคุณต้องใช้|.(หรือคุณคิดว่าเป็นแบบนี้
โคล

3

Perl 6 , 53 ไบต์

{(sum (1,*i*$^x...*)[^2*$^n] »/»(1,|[\*] 1..*)).re}

ลองออนไลน์!

นี้จริงคำนวณที่ซับซ้อนชี้แจงอีสำหรับสองเท่าของจำนวนของคำที่ต้องการและจากนั้นจะใช้เวลาส่วนจริง


2

MATLAB พร้อมกล่องเครื่องมือคณิตศาสตร์สัญลักษณ์, 57 ไบต์

@(x,n)eval(subs(taylor(sym('cos(x)'),'Order',2*n),'x',x))

นี้กำหนดฟังก์ชั่นที่ไม่ระบุชื่อกับที่ใช้doubleปัจจัยการผลิตx, nและผลผลเป็นdoubleและผลผลเป็น

ตัวอย่าง (ทดสอบบน R2015b):

>> @(x,n)eval(subs(taylor(sym('cos(x)'),'Order',2*n),'x',x))
ans = 
    @(x,n)eval(subs(taylor(sym('cos(x)'),'Order',2*n),'x',x))
>> f = ans; format long; f(0,1), f(0.5,1), f(0.5,2), f(0.5,4), f(0.5,9), f(2,2), f(2,5)
ans =
     1
ans =
     1
ans =
   0.875000000000000
ans =
   0.877582465277778
ans =
   0.877582561890373
ans =
    -1
ans =
  -0.415873015873016

2

JavaScript ES7 60 ไบต์

x=>a=n=>--n?(-1)**n*x**(2*n)/(f=m=>m?m*f(m-1):1)(2*n)+a(n):1


x=>a=n=>                                                         // Curry-d function, it basically returns another function
        --n?                                              :1  // subtract one from n. If n - 1 is 0, return 1
            (-1)**n*                                             // This generates the sign of the number
                    x**(2*n)/                                    // This creates the part before the division, basicaly x^2n
                             (f=m=>m?m*f(m-1):1)(2*n)            // This creates a recursive factorial function and calls it with 2n
                                                     +a(n)    // Recursively call the function. This adds the elements of the taylor series together

วิธีใช้:

กด F12 พิมพ์ฟังก์ชั่นแล้วทำ

c(x)(n)

2

C 144 130 ไบต์

F(m){int u=1;while(m)u*=m--;return u;}float f(float x,n){float s;for(int i=1;i<n;i++)s+=pow(-1,i)*pow(x,2*i)/(F(2*i));return 1+s;}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

//Function to calculate factorial
int F(int m)
{
  int u=1;

  while(m>1)
   u*=m--; 

  return u;
}

//actual function called in main function   
float f(float x, int n)
{

  float s=0.0;

  for(int i=1;i<=n-1;i++)
     s+=pow(-1,i)*pow(x,2*i)/(F(2*i)); 

  return 1+s;
 }

ขอบคุณเควินที่ช่วยประหยัดไบต์!


คุณสามารถบันทึกไม่กี่ไบต์โดยการนวดนิยามฟังก์ชั่น:F(m){...}f(x,n)float x;{...}
เควิน

ตั้งแต่ u * 1 == u คุณสามารถสร้างการวนซ้ำในฟังก์ชันแรกอย่างใดอย่างหนึ่งwhile(m)u*=m--หรือu=m;while(--m)u*=m(ความยาวเท่ากัน)
Kevin

i<=n-1เหมือนกับi<n
เควิน

@ เควินขอบคุณคุณถูกต้องอย่างแน่นอนไม่ได้เล่นกอล์ฟมาระยะหนึ่งแล้ว :)
Abel Tom



2

สแตกซ์ , 12ไบต์

ü┘·.ⁿYeò≥Vîû

เรียกใช้และแก้ไขข้อบกพร่อง

คลายกล่อง ungolfed และแสดงความคิดเห็นมันมีลักษณะเช่นนี้

            Input is `x n`
Z           Push a zero underneath the top.  The stack is now `x 0 n` 
D           Run the rest of the program n times.
  xJNi|*    (-x*x)^i where i is the iteration index
  iH|F/     divide that by factorial(2i)
  +         add to the running total so far
            final result is implicitly printed

เรียกใช้อันนี้



1

PHP, 76 ไบต์

for($f=1;$i<$argv[2]*2;$f*=++$i)$i&1?:$s+=(-1)**$k++*$argv[1]**$i/$f;echo$s;

ใช้XและNจากอาร์กิวเมนต์บรรทัดคำสั่ง; -rทำงานด้วย

วนซ้ำ$iจาก0ถึงN*2-1, ค้างไว้fac($i)ใน$f; ถ้าจะยิ่งเพิ่มระยะผลรวม$i $sพิมพ์ผลรวม


ฉันหวังว่าฉันจะมีตัวเลขที่ซับซ้อน (ด้วยM_Iเป็นหน่วยจินตภาพ);
ฉันจะคูณ$fด้วยM_I*++$iและบันทึก 7 ไบต์

บางที Mathematica ก็สามารถทำเช่นนั้นได้ แต่ Mathematica ไม่จำเป็นต้องทำ

ฉันสามารถบันทึกสองไบต์ด้วยcos(M_PI*$i/2)แทน$i&1?:และ(-1)**$k++;
แต่มันจะรู้สึกแปลกสักหน่อยที่จะใช้โคไซน์บิวอินเพื่อสร้างฟังก์ชันโคไซน์


1

ความจริง 36 ไบต์

g(a,n)==eval(taylor(cos(x)),a).(2*n)

สร้างอนันต์ (ในความหมายที่ จำกัด แต่เราสามารถขอให้สร้างรายการขององค์ประกอบ 2 * n ถ้าพีซีมีหน่วยความจำเพียงพอ) รายการของผลรวมบางส่วนสำหรับซีรีส์เทย์เลอร์สำหรับ cos (x) คำนวณใน 'a' ใน "eval ( เทย์เลอร์ (cos (x)) ซึ่งเป็น) "; รับองค์ประกอบ 2 * n ของรายการนั้นใน ". (2 * n)" กรณีทดสอบ:

(47) -> g(0,1)
   (47)  1
                                                 Type: Expression Integer
(48) -> g(0.5,1)
   (48)  1.0
                                                   Type: Expression Float
(49) -> g(0.5,2)
   (49)  0.875
                                                   Type: Expression Float
(50) -> g(0.5,4)
   (50)  0.8775824652 7777777778
                                                   Type: Expression Float
(51) -> g(0.5,9)
   (51)  0.8775825618 9037271611
                                                   Type: Expression Float
(52) -> g(2.0,5)
   (52)  - 0.4158730158 7301587302
                                                   Type: Expression Float
(53) -> g(2.0,800)
   (53)  - 0.4161468365 471423870

1

J , 17 ไบต์

4 :'2&o.T.(+:y)x'

ลองออนไลน์!

ใช้ในตัวซึ่งฉันถือว่าโอเค

น่าเสียดายที่ฉันไม่รู้วิธีทำงานได้ดีกับฟังก์ชั่นที่รับการโต้แย้งผ่านการแช่งแบบนี้ดังนั้นฉันจึงต้องทำสิ่งนี้อย่างชัดเจน ฉันแน่ใจว่ามีวิธีที่จะทำโดยปริยายหรือสั้นกว่า


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.