구현

2012-01-10 4 views
1

1)구현

Sum := 0; 
for J in 1 .. N loop 
Sum := Sum + J; 
end loop; 

2) 두 번째 (오른쪽) 솔루션보다 광범위한 가치를 제공합니다. "일반"의 의미는 - 오버플로없이 계산할 수 있습니까? 우리가 정말 여기 합산에 대해 이야기하고 있기 때문에 따로

+0

Ada의 할당 연산자는 중간에 공백이없는': ='* *입니다. (1)에 잘못된 점이 있습니다. 매번 겹쳐 쓰여지고 모든 입력에 대해 올바른 값을 제공하지 않습니다. (2) 우연히 3의 입력에 대한 올바른 값을 제공합니다. 나는 당신이 농담 만하는 줄 알았지 만, 전에 합리적인 질문을 한 것을 봅니다. –

+1

둘 다 계승 함수를 계산하지 않으며 구문 적으로 올바른 것도 아닙니다. (': ='연산자는 하나의 토큰이며 많은 세미콜론이 없습니다.) –

+0

'Sum : = 0;for J in 1 .. N 루프 합계 : = 합계 + J; 끝 루프, ' 아, 죄송합니다! PDF에서 복사했습니다. 그러므로 그것은 정확하지 않았습니다. – stardust

답변

4

"더 일반적인"은 "더 큰 범위의 숫자에 대해 오버플로가없이 계산 될 수 있음"을 의미해야한다고 생각합니다.

(2)의 중간 생성물은 2^31-1 (32 비트의 경우 최신 기계를 사용하기 때문에 3236 비트)에서 오버플로합니다. 즉, 가장 큰 법적 결과는 2^30 - 1. (1) 거의까지 다시 계속하게됩니다

이 프로그램은 한계를 탐구 : 당신이 gnatmake -gnato summation.adb로 컴파일하고 실행하면

with Ada.Exceptions; 
with Ada.Text_IO; use Ada.Text_IO; 
procedure Summation is 
    N : Integer := 1; 
    Sum : Integer; 
begin 
    loop 
     Put (Integer'Image (N) & " => "); 
     Sum := ((N + 1) * N)/2; 
     Put_Line (Integer'Image (Sum)); 
     N := N + 1; 
    end loop; 
exception 
    when E : others => 
     Put_Line (Ada.Exceptions.Exception_Message (E)); 
end Summation; 

을하고 (당신이 그렇게 오래 기다릴 수 있다면!) 끝 :

46337 => 1073581953 
46338 => 1073628291 
46339 => 1073674630 
46340 => 1073720970 
46341 => summation.adb:9 overflow check failed 
그 GNAT 숫자 오버플로 검사를하지 않도록 당신의 -gnato을두면 16,

(I 효율성에 대한 기억으로 선정 유감 디폴트)이 발생합니다

46337 => 1073581953 
46338 => 1073628291 
46339 => 1073674630 
46340 => 1073720970 
46341 => -1073716337 
46342 => -1073669995 
46343 => -1073623652 

난 당신이 더 이상 범위를 얻을 수도있을 것 같군요 NN + 1 중 어느 것이 짝수 (1이 분명히!) 여야했는지를 2로 나누어 곱셈을 수행합니다.

이것은 실제로 Ada의 문제는 아닙니다. (-gnato은 다른 언어에서 발생할 수있는 것보다 잘못되었을 때를 쉽게 볼 수 있지만) 사실 계승은 아닙니다. 제목을 편집 할 수 있습니까?

+0

고맙습니다. 이해합니다. – stardust

2

구문 (우리가 개념적으로하지 syntatically이보고있는),

, 그 응답 것입니다.

왜 왼쪽이 더 일반적인 지 대부분의 사람들은 1에서 n까지의 합계에 대한 바로 가기가 있음을 잊어 버렸기 때문에 내 첫 번째 추측이라고 생각합니다. 두 방정식이 수학적으로 동일하므로. 어떤 시스템이 더 빠릅니까?

1에서 n까지 각 개별 번호를 추가하는 지루한 작업을 수행합니다.

위키피디아의 요약 기사를 보면 1-100의 합계에 99 개의 추가가 필요하다는 것을 알 수 있습니다. http://en.wikipedia.org/wiki/Summation

반면 오른쪽의 수식 (바로 가기)은 나누기와 곱하기 및 하나의 덧셈 만 수행합니다.

두 번째 추측은 특정 상황 (어쩌면 더 많은 상황)에서 n 추가를하는 것이 더 빠를 것입니다. 시스템 종속적 인 상황과 문제에 따라 달라 지므로 그럴 가능성이 적습니다.

이 문서에 대한 참조를 주시면 컨텍스트가 도움이 될 것입니다.