2015-09-25 5 views
0

Я написал программу для вычисления sin (x) с использованием серии Maclaurin, но когда я попытался отладить ее, она выдала ошибку переполнения. Вот код, может ли кто-нибудь помочь мне?Серия maclaurin для sin (x)

Public Class Form1 
    Private Function sin(ByVal x As Double) As Double 
     Dim sinx, radx, abc As Double 
     sinx = 0 
     radx = x * Math.PI/180 
     For i = 1 To 20 Step 2 
      abc = (Math.Pow(-1, (i/2)) * Math.Pow(radx, i))/factorial(i) 
      sinx += abc 
     Next 
     Return sinx 
    End Function 

    Private Function factorial(ByVal n As Integer) As Integer 
     If (n = 0) Or (n = 1) Then 
      Return 1 
     Else 
      Return n * factorial(n - 1) 
     End If 
    End Function 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    End Sub 

    Private Sub BtnCalc_Click(sender As Object, e As EventArgs) Handles BtnCalc.Click 
     Dim x As Integer 
     x = Val(TxtInput.Text) 
     TxtAns.Text = sin(x) 
    End Sub 
End Class 
+0

Одна из проблем заключается в том, что ваша петля пытается вычислить e факториал 20, который слишком велик, чтобы вписаться в Integer. Он должен вписываться в длинный, хотя, поэтому попробуйте изменить функцию Factorial, чтобы вернуть Long. – Blackwood

+0

@blackwood Я просто пробовал и отлаживал его, я получил результат «Нан» –

+0

Боюсь, что я не знаком с серией Maclaurin, поэтому я могу иметь ограниченную помощь. Одной из причин для NaN (Not a Number) является то, что ваша петля пытается поднять -1 до степени x.5 (другими словами, вычислить квадратный корень из -1). Вы уверены, что используете правильный алгоритм? – Blackwood

ответ

0

ниже код дает ответ на синус угла, используя ряд Маклорена

для интерфейса нужно 2 метки, 2 текстовых полей и 3 кнопки

Открытый класс Maclaurin_series

Private Function sin(ByVal x As Double) As Double 
    Dim sinx, radx, abc As Double 
    sinx = 0 
    radx = x * Math.PI/180 
    For i = 1 To 20 Step 2 
     abc = (Math.Pow(-1, (i \ 2)) * Math.Pow(radx, i))/factorial(i) 
     sinx += abc 
    Next 
    Return sinx 
End Function 

Private Function factorial(ByVal n As Integer) As Long 

    If (n = 0) Or (n = 1) Then 
     Return 1 
    Else 
     Return n * factorial(n - 1) 
    End If 
End Function 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

End Sub 

Private Sub BtnCalc_Click(sender As Object, e As EventArgs) Handles BtnCalc.Click 
    Dim x As Integer 
    x = Val(TxtInput.Text) 
    TxtAns.Text = sin(x) 
End Sub 


Private Sub BtnExit_Click(sender As Object, e As EventArgs) Handles BtnExit.Click 
    Close() 
End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    TxtAns.Text = "" 

    TxtInput.Text = " " 
End Sub 

Конец Класс