MulDiv (i1,i2,i3)各个参数之间到底是怎么样运算的(20分)

  • 主题发起人 主题发起人 milesmaqi
  • 开始时间 开始时间
M

milesmaqi

Unregistered / Unconfirmed
GUEST, unregistred user!
MulDiv (i1,i2,i3)各个参数之间到底是怎么样运算的
MulDiv (i1,i2,i3)各个参数之间到底是怎么样运算的

 
if i3 = 0 then
Result := -1
else
Result := i1*i2/i3;
 
同意楼上,但小有问题,应该是:
if i3 = 0
then Result := -1
else Result := i1*i2 div i3;
 
呵呵, 多谢提醒, 不过也不是你那样, 正确的应该是:
if i3 = 0 then
Result := -1
else
Result := Round(i1*i2/i3);
参数与返回值都是整数。
帮助是这么说的:
The MulDiv function multiplies two 32-bit values and then divides the 64-bit
result by a third 32-bit value. The return value is rounded up or down to the
nearest integer.
 
to xianjun:
Delphi6的 QGraphics.MulDiv是我的算法,不信你实验一下.
标准单元的MulDiv是你的方法.
非常喜欢你的争论.
我的E-mail: ZXDarwin@163.net
希望得到你的 E-mail
 
int64(i)*j div k 才对 (把i强制转换为int64可以使计算结果用64bit保存)
i*j div k 只对i,j比较小的有用,把i,j搞得很大,用足32bit,就看出我的才是对的了
 
我的默认是 var i1,i2,i3:Int64;
没有必要写出Int64(i1);
 
TO PIPI:
API里应该是round(int64(i * j) / k)吧?
The MulDiv function multiplies two 32-bit values and then divides the 64-bit
result by a third 32-bit value. The return value is rounded up or down to
the nearest integer.
int MulDiv(
int nNumber, // 32-bit signed multiplicand
int nNumerator, // 32-bit signed multiplier
int nDenominator // 32-bit signed divisor
);

Delphi6的QGraphic单元里也有一个,不过跟API有些不同,它是这样写的:
function MulDiv(Number, Numerator, Denominator: Integer): Integer;
begin
if Denominator = 0 then
begin
Result := -1;
Exit;
end;
Result := (Int64(Number) * Numerator) div Denominator;
end;
 
to DarwinZhang:
既然你的是int64了,就直接运算就可以了,也不必MulDiv了
MulDiv是为不支持64位整数运算的程序语言准备的win32api

to xianjun:
错!你看看下面的就知道了
var
i,j,k:integer;
begin
i:=$34567890;
j:=$34567890;
k:=$34567890;
ShowMessage(IntToHex(i*j div k,16));
ShowMessage(IntToHex(int64(i*j) div k,16));
ShowMessage(IntToHex(int64(i)*j div k,16));
ShowMessage(IntToHex(muldiv(i,j,k),16));
end;
为什么int64(i)*j正确,而 int64(i*j) 不正确呢
原因就是 int64(i)*j ,只要i转换为64位,后面的计算结果都是64位
而 int64(i*j) ,i*j 计算结果是32位的,计算结果已经丢失了,再转换为64位
已经无意义了
 
to Pipi.:
多谢指点, 这一层倒是没有想到了, 我只是看着API帮助想当然写出了上面的疑问。
再看了一下,发现Delphi6在QGraphic里的muldiv与Win32 API的muldiv结果确实是不同的:
NEW一个CLX Application,再执行下面的代码就看得很清楚了:
uses
Windows;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k:integer;
begin
i:=$24567890;
j:=$34567890;
k:=$84567891;
ShowMessage('i*j div k = ' + IntToHex(i*j div k,16));
ShowMessage('int64(i*j) div k = ' + IntToHex(int64(i*j) div k,16));
ShowMessage('int64(i)*j div k = ' + IntToHex(int64(i)*j div k,16));
ShowMessage('QGraphics.muldiv(i,j,k) = ' + IntToHex(QGraphics.muldiv(i,j,k),16));
ShowMessage('Windows.muldiv(i,j,k) = ' + IntToHex(Windows.muldiv(i,j,k),16));
end;

 
上面写的那个K好象已经越界了, 换一下:
var
i,j,k:integer;
begin
i:=$24567890;
j:=$34567890;
k:=$44567890;
ShowMessage('i*j div k = ' + IntToHex(i*j div k,16));
ShowMessage('int64(i*j) div k = ' + IntToHex(int64(i*j) div k,16));
ShowMessage('int64(i)*j div k = ' + IntToHex(int64(i)*j div k,16));
ShowMessage('QGraphics.muldiv(i,j,k) = ' + IntToHex(QGraphics.muldiv(i,j,k),16));
ShowMessage('round(int64(i)*j / k) = ' + IntToHex(round(int64(i)*j / k),16));
ShowMessage('Windows.muldiv(i,j,k) = ' + IntToHex(Windows.muldiv(i,j,k),16));
 
to pipi:
现在讨论的是Delphi内的过程,另外,也没有规定说
这是Windows为不支持Int64语言准备的,拿来主义吗!
不能说没有必要,比如:
不能因为有Tan就不要ArcTan函数.
另外你只要一有Int64(i1),那末Delphi中就会把等式中的
数字都变成Int64型.这就和我的定义相同了.
比如:
i*int64(j) div k和 Int64(i)*j div k 是一样的.
 
我不是那个意思,说不能用,只是顺便提到说这个api是这个目的
至于 i*int64(j) 和 Int64(i)*j ,我上面主要是说xianjun的int64(i*j)是不对的,没说你的有什么问题啊
 
后退
顶部