Ada の値の対数を求めるコードをどのように作成しますか?

StackOverflow https://stackoverflow.com/questions/2234397

  •  19-09-2019
  •  | 
  •  

質問

Ada (GNAT) の使用:指定された値の 10 のべき乗を決定する必要があります。最も明白なアプローチは、対数を使用することです。しかし、それはコンパイルに失敗します。

with Ada.Numerics.Generic_Elementary_Functions;
procedure F(Value : in Float) is
      The_Log : Integer := 0;
begin
      The_Log := Integer(Log(Value, 10));
      G(Value, The_Log);
end;

エラー:

  • ユーティリティ.adb:495:26:「ログ」が表示されない
    • ユーティリティ.adb:495:26:a-ngelfu.ads:24 の非表示宣言、482 行目のインスタンス
    • ユーティリティ.adb:495:26:a-ngelfu.ads:23 の非表示宣言、482 行目のインスタンス

そこで、パッケージを参照しようとしますが、これも失敗します。

with Ada.Numerics.Generic_Elementary_Functions;
procedure F(Value : in Float) is
      The_Log : Integer := 0;
      package Float_Functions is new Ada.Numerics.Generic_Elementary_Functions (Float);
begin
      The_Log := Integer(Float_Functions.Log(Value, 10));
      G(Value, The_Log);
end;

エラー:

  • ユーティリティ.adb:495:41:実際の解釈と一致する候補の解釈はありません。
  • ユーティリティ.adb:495:41:「Log」の呼び出しに引数が多すぎます
  • ユーティリティ.adb:495:53:予期されるタイプ「Standard.Float」
  • ユーティリティ.adb:495:53:a-ngelfu.ads:24 の「Log」への呼び出しで、482 行目のインスタンスに汎用整数型 ==> が見つかりました。
役に立ちましたか?

解決

私はあなたがまだたりない、それを固定した場合に知っているが、ここでの答えですありません。

すべての

まず、私はあなたの代わりに非一般的な1つを使用することができる汎用的なバージョンのインスタンスを作成するときにFloatを渡している参照としてます。

あなたはそれをあなたがした第二の方法を行う必要があり、一般的なバージョンを使用する場合は、

、あなたは、その機能を使用する前に、パッケージをインスタンス化する必要があります。

のa-ngelfu.ads のを見て、あなたが(ちょうど1のパラメータを持つ自然対数のための別の機能があります)必要な機能の実際のプロトタイプを見ることができます

function Log(X, Base : Float_Type'Base) return Float_Type'Base;

あなたはベースがあまりにもfloat型にする必要があることがわかります。ジェネリック版のための正しいコードは以下のようになります:

with Ada.Numerics.Generic_Elementary_Functions;

procedure F(Value : in Float) is
    -- Instantiate the package:
    package Float_Functions is new Ada.Numerics.Generic_Elementary_Functions (Float);
    -- The logarithm:
    The_Log : Integer := 0;
begin
    The_Log := Integer(Float_Functions.Log(Value, 10.0));
    G(Value, The_Log);
end;

非ジェネリック1はまったく同じになります:

with Ada.Numerics.Elementary_Functions;

procedure F(Value : in Float) is
    -- The logarithm:
    The_Log : Integer := 0;
begin
    The_Log := Integer(Ada.Numerics.Elementary_Functions.Log(Value, 10.0));
    G(Value, The_Log);
end;

他のヒント

ザンディは正しいです。彼の解決策はうまくいきました。

ただし、エイダには注意すべき例外が 2 つありました...

  • 値 < 0.0
  • 値 = 0.0

ガードがない場合、この関数をそのまま使用すると例外が生成されます。また、返される The_Log は < 0、0、> 0 の場合があることに注意してください。

with Ada.Numerics.Elementary_Functions; 

procedure F(Value : in Float) is 
    -- The logarithm: 
    The_Log : Integer := 0; 
begin 
    if Value /= 0.0 then
        The_Log := Integer(
             Ada.Numerics.Elementary_Functions.Log(abs Value, 10.0)); 
    end if;
    G(Value, The_Log); 
end; 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top