在 Pascal 中遇到一个非法类型转换的孩子

Meet a Illegal Type conversion prolem in Pascal

    program ideone;
    const m = 7;
    const n = 5;
    var  x:Real;
    var  y:Real;
    var  z:Real;
    var  q:Real;
    var  r:Real;

    procedure  multiply();
    var a:Real;
    var b:Real;
    begin  a := x;  b := y;  z := 0;
      while b > 0 do
        begin  
          if odd(Qword(b)) then z := z + a;
          writeln('x');
          a := 2*a;  
          b := b/2;
        end
    end;

    begin 
      x := m;  y := n;  
      multiply();
      writeln(z);
    end.

程序“multiply”是用来计算两个的乘积的number.But当程序运行时,似乎会出现死循环并保持打印"x"。

可能是因为"b"的类型是"Real",所以"b = b/2"这行永远不会导致var"b"小于等于0,而"b <= 0" 是循环的出口。

所以我改变了b的类型ti Integer希望b/2能在b为Integer的时候使b变为0

    program ideone;
    const m = 7;
    const n = 5;
    var  x:Integer;
    var  y:Integer;
    var  z:Integer;
    var  q:Integer;
    var  r:Integer;

    procedure  multiply();
    var a:Integer;
    var b:Integer;
    begin  a := x;  b := y;  z := 0;
      while b > 0 do
        begin  
          if odd(Qword(b)) then z := z + a;
          writeln('x');
          a := 2*a;  
          b := b/2;
        end
    end;

    begin 
      x := m;  y := n;  
      multiply();
      writeln(z);
    end.

然后又遇到一个问题:

test.pas(19,13) Error: Incompatible types: got "Extended" expected "SmallInt"

为了解决这个问题,我在行 "b = b/2"

中添加了一个转换
 b := Integer(b/2);

但出现另一个错误:

test.pas(19,12) Error: Illegal type conversion: "Extended" to "SmallInt"

我应该怎么做才能解决这个系列问题。

对于第一个问题,你必须意识到 Real 数字并不精确,当你使用它们时,你总是必须使用 tolerance value 或数学上的 round 他们

const tolerance:Real = 0.001;
while b > tolerance do

while Round(b) > 0 do

对于转换问题,也请使用 Round()