7

私は現在 Ada を独学していますが、より一般的な問題に取り組むことから始めることもできます。

より具体的には、階乗 n! を計算しようとしますが、n>100 です。これまでの私の実装は次のとおりです。

with Ada.Text_IO;
with Ada.Integer_Text_IO;

use Ada.Text_IO;

procedure Factorial is 
    -- define a type covering the range beginning at 1 up to which faculty is to
    -- be computed.
    subtype Argument is Long_Long_Integer range 1..100;

    -- define a type that is large enough to hold the result
    subtype Result is Long_Long_Integer range 1..Long_Long_Integer'Last;
    package Result_IO is new Ada.Text_IO.Integer_IO(Result); use Result_IO;

    -- variable holding the faculty calculated.
    fac : Result := 1;

begin
    -- loop over whole range of ARGUMENT and calculate n!
    for n in ARGUMENT loop
        fac := (fac * n);
    end loop;
end;

問題は、Long_Long_Integer でさえこれには小さすぎる可能性があり、n>20 の場合は CONTRAINT_ERROR 例外をスローすることです。

任意のサイズの整数を実装するパッケージはありますか?

ありがとう!

PS: この演習でループを調べたかったので、再帰を選択しませんでした。それ以外の場合は、コードのすべての側面 (スタイル、ベスト プラクティス、エラーなど) についてコメントしてください。

4

3 に答える 3

9

Ada Crypto Library は大きな符号なし数値 ( Big_Numbers) をサポートしています。lib はhttp://sourceforge.net/projects/libadacrypt-dev/からダウンロードできます。svn をチェックアウトすることをお勧めします。現在のリリースの Big_Numbers 乗算関数には小さなバグがあります。

AdaCore Libre サイトから最新の GNAT コンパイラで lib をコンパイルできます。

gccのバグのため、lib は gcc-4.3 または gcc-4.4 ではコンパイルされません。

最後に、LibAdaCrypt から 2 つの 512 ビット Big_Numbers を乗算する方法の小さな例を示します。

package Test.Big_Numbers is

with Crypto.Types.Big_Numbers;

pragma Elaborate_All(Crypto.Types.Big_Numbers);

package Big is new Crypto.Types.Big_Numbers(512);
    use Big;
    use Big.Utils;
end Test.Big_Numbers;



package body Test.Big_Numbers is

x : Big_Unsigned := To_Big_Unsigned("16#57C19F8F7866F8633AC1D25B92FC83B4#");
Y : Big_Unsigned := To_Big_Unsigned("16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60#");

x := X * Y;
Put_Line(X);

end Test.Big_Numbers;
 
よろしくお願いします
   キリスト教徒
于 2009-08-21T14:58:28.320 に答える
2

私が収集したものから、すべてのAdaコンパイラには任意の長さの算術演算が組み込まれています。言語で定義されている方法で、名前付き数値(タイプレス数値定数)をサポートする必要があります。

それを考えると、その標準がユーザーにその施設への標準的なアクセスを提供しなかったのは残念です。繰り返しになりますが、コンパイラーが必要とするものに使用できることと、一般的な使用に使用できることは、多くの場合、2つの異なるものである可能性があります。

于 2009-08-24T18:31:12.223 に答える
0

Ada 202X の今後のバージョンでは、GNAT を使用した任意の整数処理のサポートがライブラリ パッケージ Numerics.Big_Numbers.Big_Integers に含まれています。

ARM の詳細:
http://www.ada-auth.org/standards/2xrm/html/RM-A-5-6.html

于 2022-02-10T22:08:50.410 に答える