Страницы

Превращение F

Убого:

MODULE Power;

 PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
 VAR y: REAL; i: INTEGER;
 BEGIN
  ASSERT(n >= 0);

  y := 1.0; i := n;
  WHILE i > 0 DO
    IF ODD(i) THEN y := y*x END;
    x := x*x; i := i DIV 2
  END
 RETURN
  y
 END Do;

END Power.
Уже лучше:
: power ( real x  integer n -- real )
  real y  integer i

  n 0 < assert
  1.0 =:y
  n =:i
  begin
    i 0 >
  while
    i odd if y x * =:y then
    x x * =:x
    i 2 div =:i
  end
  y
;
Божественно:
: power ( n -- ) ( F: x -- y )
  dup 0< if drop fdrop abort then
  >r 1e
  begin r@ 0> while
    r@ 1 and 0<> if fover f* then
    fswap fdup f* fswap
    r> 2/ >r
  repeat
  r> drop fnip
;

Комментариев нет:

Отправить комментарий