1)実施
Sum := 0;
for J in 1 .. N loop
Sum := Sum + J;
end loop;
2)第2(右)のソリューションよりも幅広い価値を提供します。オーバーフローせずに "一般的"とは何を意味するのでしょうか?余談
1)実施
Sum := 0;
for J in 1 .. N loop
Sum := Sum + J;
end loop;
2)第2(右)のソリューションよりも幅広い価値を提供します。オーバーフローせずに "一般的"とは何を意味するのでしょうか?余談
「より一般的な」とは、「より大きな範囲の数値に対してオーバーフローなしで計算できる」と考える必要があります。
(2)の中間生成物は2^31-1でオーバーフローします(最新のマシンでは32ビットの場合)。これは、最大の法的結果が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
を除外した場合
(私は効率のために覚えているとして選ば残念デフォルトでは、)これが起こる:
46337 => 1073581953
46338 => 1073628291
46339 => 1073674630
46340 => 1073720970
46341 => -1073716337
46342 => -1073669995
46343 => -1073623652
私はあなたが長い範囲を得ることができると仮定しますN
とN + 1
のどちらかが掛け合っているかどうか(明らかに!でなければなりません)を2倍してから乗算します。
これは実際にはAdaの問題ではありません(-gnato
は、他の言語で起こる可能性があるよりも簡単に見えるようになりますが)。タイトルを編集することは可能ですか?
ありがとう、私は理解しています。 – stardust
構文(我々は概念的にはない構文上、この見ている)、
私たちは本当にここ和について話しているので、私はそれに反応します。
私が最初に推測した理由は、ほとんどの人が1からnまでのiの合計にショートカットがあることを忘れるためです。両方の式は数学的に等価であるからです。あなたのシステムでどれが速いのですか?
1からnまでの個々の番号を追加するという面倒な作業があります。
ウィキペディアの集計記事を見ると、1-100の合計に99個の追加が必要であることがわかります。 http://en.wikipedia.org/wiki/Summation
右側の式(ショートカット)は、除算と乗算と1回の加算だけを行います。
私の2番目の推測はおそらくn個の追加を行う方が速い(多分もっと多くの)状況にあるかもしれません....それはシステム依存の状況と問題依存です。
このドキュメントに関する参考資料を教えてください。本当に役に立つと思いますか?
Adaの代入演算子は、中間にスペースを入れないで ':=' * *です。 (1)に何か問題があり、「Sum」は毎回上書きされ、入力に対して正しい値を与えません。 (2)は誤って3の入力に対して正しい値を与える。私はあなたがただ冗談だと思ったが、私はあなたに賢明な質問をする前に... ... –
どちらも、階乗関数を計算しておらず、どちらも構文的に正しい。 ( ':='演算子は単一のトークンであり、たくさんのセミコロンがありません。) –
'Sum:= 0; for J in 1 .. Nループ 合計:=合計+ J; 終了ループ; ' ああ、申し訳ありません!私はPDFからコピーしました。したがって、それは正しくありませんでした。 – stardust