瀏覽代碼

* patch by Alexey Torgashin to resolve #40054

florian 2 年之前
父節點
當前提交
48b9751419
共有 1 個文件被更改,包括 25 次插入8 次删除
  1. 25 8
      rtl/objpas/math.pp

+ 25 - 8
rtl/objpas/math.pp

@@ -398,8 +398,8 @@ function Power(base,exponent : float) : float;
 { base^exponent }
 function IntPower(base : float;exponent : longint) : float;
 
-operator ** (bas,expo : float) e: float; inline;
-operator ** (bas,expo : int64) i: int64; inline;
+operator ** (base,exponent : float) e: float; inline;
+operator ** (base,exponent : int64) res: int64;
 
 { number converting }
 
@@ -1088,16 +1088,33 @@ function intpower(base : float;exponent : longint) : float;
   end;
 
 
-operator ** (bas,expo : float) e: float; inline;
+operator ** (base,exponent : float) e: float; inline;
   begin
-    e:=power(bas,expo);
+    e:=power(base,exponent);
   end;
 
 
-operator ** (bas,expo : int64) i: int64; inline;
-  begin
-    i:=round(intpower(bas,expo));
-  end;
+operator ** (base,exponent : int64) res: int64;
+begin
+  if exponent<0 then
+    begin
+      if base<=0 then
+        raise EInvalidArgument.Create('Non-positive base with negative exponent in **');
+      if base=1 then
+        res:=1
+      else
+        res:=0;
+      exit;
+    end; 
+  res:=1;
+  while exponent<>0 do
+    begin
+      if exponent and 1<>0 then
+        res:=res*base;
+      exponent:=exponent shr 1;
+      base:=base*base;
+    end;
+end;
 
 
 function ceil(x : float) : integer;