2016-10-14 4 views
0
(define (make-complex a b) (cons a b)) 
(define (real x) (car x)) 
(define (imag x) (cdr x)) 
(define (complex-sqrt x) 
    (define (first a b) (sqrt (/ (+ a 
           (sqrt (+ 
            (* a a) 
            (* b b)))) 
          2))) 
    (define (second a b) (sqrt (/ (+ (* -1 a) 
           (sqrt (+ 
             (* a a) 
             (* b b)))) 
          2))) 
    (cons (first (real x) (imag x)) (second (real x) (imag x)))) 
    (complex-sqrt (make-complex 2 0)) 
    (complex-sqrt (make-complex -3 0)) 

Так что для некоторого контекста эта функция находит квадратный корень из комплексного числа. а - действительная часть комплексного числа, а Ь - мнимая часть. Функция complex-sqrt не должна работать для некоторых значений b = 0, но я не уверен, почему. Я пробовал несколько значений a, где b равно 0, и помещал их в мой калькулятор, но они оба дают мне тот же ответ.квадратный корень из комплексных чисел в схеме

Спасибо

ответ

0

Внедренная формула является неправильным для отрицательного b с квадратом

sqrt((sqrt(a*a+b*b)+a)/2) +i*sqrt((sqrt(a*a+b*b)-a)/2) 

является

a + i*sqrt((a*a+b*b) - a*a) = a + i*abs(b) 

, который затем не оригинальный номер.


Для b=0 термин sqrt(a*a) может производить число немного меньше, чем abs(a), так что один из действительной и мнимой части имеет отрицательное выражение под внешним квадратным корнем.

+0

Как я могу это исправить? –

+0

Кроме того, вы знаете любые значения a, где b равно 0, что не будет работать для этого кода? –

+0

что-то вдоль строк 'if b <0, тогда imag = -imag'. – LutzL