为什么伏特、安培和欧姆兼容?
with ada.text_io; use ada.text_io;
procedure main is
type Volts is delta 1.0 / 2.0 ** 12 range -45_000.0 .. 45_000.0;
type Amps is delta 1.0 / 2.0 ** 16 range -1_000.0 .. 1_000.0;
type Ohms is delta 0.125 range 0.0 .. 1.0E8;
V : Volts := 1.0;
A : Amps := 1.0;
R1 : Ohms := 1.0;
R2 : Ohms := 1.0;
begin
v := A * (R1 + R2);
put_line(V'Img);
end main;
Run Code Online (Sandbox Code Playgroud)
如果类型被定义为new Float我在编译期间收到以下异常:
main.adb:22:12: error: invalid operand types for operator "*"
main.adb:22:12: error: left operand has type "Amps" defined at line 5
main.adb:22:12: error: right operand has type "Ohms" defined at line 6
Run Code Online (Sandbox Code Playgroud)
我期望使用带有 Volts 的 type 来定义与其他类型不兼容的新类型,因为它不是定点类型的显式子类型。
小智 5
自 Ada 95 起,Ada 标准明确允许(预定义)使用不同定点类型的操作数进行乘法和除法 - 请参阅http://www.ada-auth.org/standards/22rm/html/RM-4-5 -5.html,第 18 段——但仅在结果也预期为某种定点类型的情况下(参见第 19.1/2 段)。不同定点类型之间的加法和减法不是预定义的,当然不同定点类型在例如中是不兼容的。参数或赋值。
至于为什么不同类型之间允许使用*和/,我没有明确的答案。相关的 Ada 问题之一 ( http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00364.txt?rev=1.15 ) 有 Randy Brukardt 的简短评论:“.. . Ada 95 规则的出现是因为人们抱怨必须编写类型转换: A := B * 5.0; 这被认为让 Ada 看起来很糟糕。”
同一个人工智能也有批评新规则的评论……所以意见不同。