123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687(**************************************************************************)(* *)(* OCaml *)(* *)(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)(* *)(* Copyright 2002 Institut National de Recherche en Informatique et *)(* en Automatique. *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)(* Complex numbers *)typet={re:float;im:float}letzero={re=0.0;im=0.0}letone={re=1.0;im=0.0}leti={re=0.0;im=1.0}letaddxy={re=x.re+.y.re;im=x.im+.y.im}letsubxy={re=x.re-.y.re;im=x.im-.y.im}letnegx={re=-.x.re;im=-.x.im}letconjx={re=x.re;im=-.x.im}letmulxy={re=x.re*.y.re-.x.im*.y.im;im=x.re*.y.im+.x.im*.y.re}letdivxy=ifabs_floaty.re>=abs_floaty.imthenletr=y.im/.y.reinletd=y.re+.r*.y.imin{re=(x.re+.r*.x.im)/.d;im=(x.im-.r*.x.re)/.d}elseletr=y.re/.y.iminletd=y.im+.r*.y.rein{re=(r*.x.re+.x.im)/.d;im=(r*.x.im-.x.re)/.d}letinvx=divonexletnorm2x=x.re*.x.re+.x.im*.x.imletnormx=(* Watch out for overflow in computing re^2 + im^2 *)letr=abs_floatx.reandi=abs_floatx.iminifr=0.0thenielseifi=0.0thenrelseifr>=ithenletq=i/.rinr*.sqrt(1.0+.q*.q)elseletq=r/.iini*.sqrt(1.0+.q*.q)letargx=atan2x.imx.reletpolarna={re=cosa*.n;im=sina*.n}letsqrtx=ifx.re=0.0&&x.im=0.0then{re=0.0;im=0.0}elsebeginletr=abs_floatx.reandi=abs_floatx.iminletw=ifr>=ithenbeginletq=i/.rinsqrt(r)*.sqrt(0.5*.(1.0+.sqrt(1.0+.q*.q)))endelsebeginletq=r/.iinsqrt(i)*.sqrt(0.5*.(q+.sqrt(1.0+.q*.q)))endinifx.re>=0.0then{re=w;im=0.5*.x.im/.w}else{re=0.5*.i/.w;im=ifx.im>=0.0thenwelse-.w}endletexpx=lete=expx.rein{re=e*.cosx.im;im=e*.sinx.im}letlogx={re=log(normx);im=atan2x.imx.re}letpowxy=exp(muly(logx))