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.
程序“乘法”用于计算两个数的乘积。但似乎会出现死循环并保持打印" x"当程序运行时。
也许是因为&#34; b&#34;是&#34; Real&#34;,所以行&#34; b = b / 2&#34;永远不会导致var&#34; b&#34;小于或等于0,而&#34; b <= 0&#34;是循环的退出。
所以我改变了b ti Integer的类型,希望当b是整数时b / 2可以使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"
为了解决这个问题,我将一个强制转换添加到行&#34; b = b / 2&#34;
b := Integer(b/2);
但发生了另一个错误:
test.pas(19,12) Error: Illegal type conversion: "Extended" to "SmallInt"
我该怎么做才能解决这一系列问题。
答案 0 :(得分:2)
对于第一个问题,您必须知道Real
数字不准确,当您使用它们时,您始终必须使用tolerance value
或数学round
它们
const tolerance:Real = 0.001;
while b > tolerance do
或
while Round(b) > 0 do
对于演员表问题,请同时使用Round()
。