Skip to content

Commit 6014db9

Browse files
authored
Merge pull request #1602 from ishaan-arora-1/fix/pow-int-division-sqrt-miscompilation
Fix pow(x, 1/2) miscompilation when exponent uses integer division
2 parents 9236c26 + 3182503 commit 6014db9

2 files changed

Lines changed: 4 additions & 3 deletions

File tree

src/analysis_and_optimization/Partial_evaluator.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -704,11 +704,10 @@ let rec eval_expr ?(preserve_stability = false) (e : Expr.Typed.t) =
704704
; { pattern=
705705
FunApp (StanLib ("Divide__", FnPlain, mem), [y; z])
706706
; _ } ] )
707-
when is_int 1 y && is_int 2 z ->
707+
when is_int 1 y && is_int 2 z
708+
&& not (y.meta.type_ = UInt && z.meta.type_ = UInt) ->
708709
let lub_mem = lub_mem_pat [mem] in
709710
FunApp (StanLib ("sqrt", suffix, lub_mem), [x])
710-
(* This is wrong; if both are type UInt the exponent is
711-
rounds down to zero. *)
712711
| ( "square"
713712
, [{pattern= FunApp (StanLib ("sd", FnPlain, mem), [x]); _}] )
714713
->

test/unit/Optimize.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2257,6 +2257,7 @@ model {
22572257
target += pow(theta, 1./2.);
22582258
target += pow(theta, 1/2.);
22592259
target += pow(theta, 1./2);
2260+
target += pow(theta, 1/2);
22602261
target += square(sd(x_vector));
22612262
target += sqrt(2);
22622263
target += sum(square(x_vector - y_vector));
@@ -2424,6 +2425,7 @@ model {
24242425
target += sqrt(34.);
24252426
target += sqrt(34.);
24262427
target += sqrt(34.);
2428+
target += pow(34., 0);
24272429
target += variance(x_vector);
24282430
target += sqrt2();
24292431
target += squared_distance(x_vector, y_vector);

0 commit comments

Comments
 (0)