2013-02-28 1 views
3

저는 Ada의 절대 초보자이며 Taylor 시리즈를 사용하여 sin (x) [sin (3)]을 계산하려고합니다. 그것을 작동시키지 마십시오. 그래서 여기Ada sin (x) Taylor 시리즈로 컴퓨팅하기

내 절차 :

with Ada.Float_Text_IO; 
with Mat; 
procedure SinKoz is 
    X:Float:=3.0; 
    Szamlalo:Float:=0.0; 
begin 
    for I in 1..100 loop 
     Szamlalo := Szamlalo + ((-1.0)**I)*(X**(2.0*I+1.0))/Mat.Faktorialis(2*I+1); 
    end loop; 
    Ada.Float_Text_IO.Put(Szamlalo); 
end SinKoz; 

그리고 매트 내부

가 여기 2의 계승을 계산 내 Faktorialis입니다 * I + 1 : 내가려고 할 때

function Faktorialis(N: Float) return Float is 
     Fakt : Float := 1.0; 
begin 
     for I in 1..N loop 
     Fakt := Fakt * I; 
     end loop; 
     return Fakt; 
end Faktorialis; 

내 코드를 컴파일하면이 오류가 발생합니다. 지수가 자연 유형이어야하며 "Standard.Float"유형을 발견했습니다

내 타입에 무엇이 잘못되었는지 알아 내려고 도와 줄 수 있습니다!

답변

3

첫 번째 질문은 다음과 같습니다. X를 비 정수로 올릴 필요가 있습니까?

나는 그렇지 않은 것처럼 보입니다.이 경우 X**(2.0*I+1.0)X**(2*I+1)으로 바꾸면 모두 잘됩니다.

하지만 당신이 정말로 (안 여기 아마도,하지만 다른 응용 프로그램에서) 어떻게 당신이 바로 그런 운영자가 볼 수 있도록해야하는 경우 : 그래서

with Ada.Numerics.Elementary_Functions; 
use Ada.Numerics.Elementary_Functions; 

와 함수 앞에 패키지 Ada.Numerics.Elementary_Functions에 떠 하나가이고 그것은 서면으로 작동해야합니다. 마지막으로 고유 한 부동 소수점 유형을 작성한 경우 유형에 매개 변수를 사용하여 일반 패키지 Ada.Numerics.Generic_Elementary_Functions을 인스턴스화하여 유형에 맞게 이러한 함수 세트를 작성할 수 있습니다.

+0

+1 : duh. 이 대답은 내 것보다 낫다. 나는 잠시 동안 Ada에서 떨어져 있었다. –

+0

감사합니다. 자세한 답변입니다. – Krav

+0

때로는 일을하는 몇 가지 방법을 아는 것이 좋은 일입니다. Ada는 잘 망쳐 놓은 도구 상자가 아닙니다 :-) –

0

Ada의 강력한 타이핑을 좋아해야합니다.

Szamlalo := Szamlalo + ((-1.0)**I)*(X**(2.0*I+1.0))/Mat.Faktorialis(2*I+1); 

2.0*I+1.0

는 플로트를 반환하는 것입니다 : 내 머리 위로 떨어져

, 나는 당신의 문제가이 줄 수있다 생각한다. 자연이 아닙니다. Integer() 또는 Natural() (Natural은 Integer의 하위 유형 임)에 랩핑을 시도하여 도움이되는지 확인하십시오.

+0

문제가되었습니다. 감사합니다. 그래, 내 취향에 정말 강하다. – Krav

관련 문제