Ada の値の対数を求めるコードをどのように作成しますか?
質問
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;
所属していません StackOverflow