使用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;
错误:
然后我尝试引用该包,但这也失败了:
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;
错误:
答案 0 :(得分:5)
我不知道你是否已经修好了,但这就是答案。
首先,正如我在实例化通用版本时看到你传递Float
时,你可以使用非通用版本。
如果您决定使用通用版本,则必须采用第二种方式,在使用其功能之前必须先实例化该包。
查看 a-ngelfu.ads ,你可能会看到你需要的函数的实际原型(只有一个参数的自然对数还有另一个函数):
function Log(X, Base : Float_Type'Base) return Float_Type'Base;
你可以看到基地也需要处于浮点类型。通用版本的正确代码是:
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;
非通用的将是完全相同的:
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;
答案 1 :(得分:3)
Xandy是对的。他的解决方案奏效了。
然而,Ada有两个例外可以防范......
没有守卫此功能,因为它会导致生成异常。并且记住返回的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;