你如何编码来确定Ada中值的对数?

时间:2010-02-10 04:23:08

标签: ada logarithm

使用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;

错误:

  • utilities.adb:495:26:“日志”不可见
    • utilities.adb:495:26: a-ngelfu.ads:24上的不可见声明,第482行的实例
    • utilities.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;

错误:

  • utilities.adb:495:41:没有候选人的解释符合实际情况:
  • utilities.adb:495:41:调用“Log”
  • 时参数太多
  • utilities.adb:495:53:预期类型“Standard.Float”
  • utilities.adb:495:53:找到类型通用整数==>在a-ngelfu.ads:24调用“Log”,第482行的实例

2 个答案:

答案 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有两个例外可以防范......

  • 价值< 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;