Function: math-sqrt
math-sqrt is an autoloaded and byte-compiled function defined in
calc-math.el.gz.
Signature
(math-sqrt A)
Aliases
Source Code
;; Defined in /usr/src/emacs/lisp/calc/calc-math.el.gz
;;; Compute the square root of a number.
;;; [T N] if possible, else [F N] if possible, else [C N]. [Public]
(defun math-sqrt (a)
(or
(and (Math-zerop a) a)
(and (math-known-nonposp a)
(math-imaginary (math-sqrt (math-neg a))))
(and (integerp a)
(let ((sqrt (cl-isqrt a)))
(if (= (* sqrt sqrt) a)
sqrt
(if calc-symbolic-mode
(list 'calcFunc-sqrt a)
(math-sqrt-float (math-float a) (math-float sqrt))))))
(and (eq (car-safe a) 'frac)
(let* ((num-sqrt (cl-isqrt (nth 1 a)))
(num-exact (= (* num-sqrt num-sqrt) (nth 1 a)))
(den-sqrt (cl-isqrt (nth 2 a)))
(den-exact (= (* den-sqrt den-sqrt) (nth 2 a))))
(if (and num-exact den-exact)
(list 'frac num-sqrt den-sqrt)
(if calc-symbolic-mode
(if (or num-exact den-exact)
(math-div (if num-exact
num-sqrt (list 'calcFunc-sqrt (nth 1 a)))
(if den-exact
den-sqrt (list 'calcFunc-sqrt (nth 2 a))))
(list 'calcFunc-sqrt a))
(math-sqrt-float (math-float a)
(math-div (math-float num-sqrt) den-sqrt))))))
(and (eq (car-safe a) 'float)
(if calc-symbolic-mode
(if (evenp (nth 2 a))
(let ((res (cl-isqrt (nth 1 a))))
(if (= (* res res) (nth 1 a))
(math-make-float res (/ (nth 2 a) 2))
(signal 'inexact-result nil)))
(signal 'inexact-result nil))
(math-sqrt-float a)))
(and (eq (car-safe a) 'cplx)
(math-with-extra-prec 2
(let* ((d (math-abs a))
(imag (math-sqrt (math-mul (math-sub d (nth 1 a))
'(float 5 -1)))))
(list 'cplx
(math-sqrt (math-mul (math-add d (nth 1 a)) '(float 5 -1)))
(if (math-negp (nth 2 a)) (math-neg imag) imag)))))
(and (eq (car-safe a) 'polar)
(list 'polar
(math-sqrt (nth 1 a))
(math-mul (nth 2 a) '(float 5 -1))))
(and (eq (car-safe a) 'sdev)
(let ((sqrt (math-sqrt (nth 1 a))))
(math-make-sdev sqrt
(math-div (nth 2 a) (math-mul sqrt 2)))))
(and (eq (car-safe a) 'intv)
(not (math-negp (nth 2 a)))
(math-make-intv (nth 1 a) (math-sqrt (nth 2 a)) (math-sqrt (nth 3 a))))
(and (eq (car-safe a) '*)
(or (math-known-nonnegp (nth 1 a))
(math-known-nonnegp (nth 2 a)))
(math-mul (math-sqrt (nth 1 a)) (math-sqrt (nth 2 a))))
(and (eq (car-safe a) '/)
(or (and (math-known-nonnegp (nth 2 a))
(math-div (math-sqrt (nth 1 a)) (math-sqrt (nth 2 a))))
(and (math-known-nonnegp (nth 1 a))
(not (math-equal-int (nth 1 a) 1))
(math-mul (math-sqrt (nth 1 a))
(math-sqrt (math-div 1 (nth 2 a)))))))
(and (eq (car-safe a) '^)
(math-known-evenp (nth 2 a))
(math-known-realp (nth 1 a))
(math-abs (math-pow (nth 1 a) (math-div (nth 2 a) 2))))
(let ((inf (math-infinitep a)))
(and inf
(math-mul (math-sqrt (math-infinite-dir a inf)) inf)))
(progn
(calc-record-why 'numberp a)
(list 'calcFunc-sqrt a))))