我的程序中有以下功能,它给了我一个EInvalidOp(无效浮点运算):
function TMyProgram.GetVal(A, B, C, D, E: double): double;
begin
Result := A/Power((C - D)/(D - B), 1/E);
end;
参数的值为:
答:320.068, B:84.46, C:91.632, D:24.15, E:11
Excel给出了-316.815的结果,但Delphi在执行此函数时给出了一个错误。
答案 0 :(得分:1)
我做了一些研究。问题在于给分数指数增加负基数。在您的特定情况下,您可以使用数学身份来解决它:
function TMyProgram.GetVal(A, B, C, D: Double; E: Integer): double;
begin
if Odd(E) and ((C - D)/(D - B) < 0) then
Result := A/-Power(Abs((C - D)/(D - B)), 1/E)
else
Result := A/Power((C - D)/(D - B), 1/E);
end;
仅当E为奇数时才有效。
答案 1 :(得分:-1)
-316.81520613
这就是Jack Lyle所提供的power2功能。
在这里查看完整代码power2
{**来自Jack Lyle的强大功能。据说比比较强大 Delphi附带的Pow功能。 }
function Power2(Base, Exponent : Double) : Double;
{ raises the base to the exponent }
CONST
cTiny = 1e-15;
VAR
Power : Double; { Value before sign correction }
BEGIN
Power := 0;
{ Deal with the near zero special cases }
IF (Abs(Base) < cTiny) THEN BEGIN
Base := 0.0;
END; { IF }
... // see the link to full code
END; { FUNCTION Pow }