From b129670ca135bd6be7b4afcadeb0bcec0675789e Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Tue, 9 Mar 2010 12:49:24 -0800 Subject: identical complex implementation for 6g and 8g. can also be used for 5g. 5g is still a stub. R=rsc CC=golang-dev http://codereview.appspot.com/362041 --- src/pkg/runtime/Makefile | 1 + src/pkg/runtime/complex.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 src/pkg/runtime/complex.c (limited to 'src/pkg/runtime') diff --git a/src/pkg/runtime/Makefile b/src/pkg/runtime/Makefile index 767472063..103515c13 100644 --- a/src/pkg/runtime/Makefile +++ b/src/pkg/runtime/Makefile @@ -48,6 +48,7 @@ OFILES=\ chan.$O\ closure.$O\ float.$O\ + complex.$O\ hashmap.$O\ iface.$O\ malloc.$O\ diff --git a/src/pkg/runtime/complex.c b/src/pkg/runtime/complex.c new file mode 100644 index 000000000..72c65467d --- /dev/null +++ b/src/pkg/runtime/complex.c @@ -0,0 +1,36 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "runtime.h" + +// complex128div(num, den complex128) (quo complex128) +void +·complex128div(float64 numreal, float64 numimag, + float64 denreal, float64 denimag, + float64 quoreal, float64 quoimag) +{ + float64 a, b, ratio, denom; + + a = denreal; + if(a < 0) + a = -a; + b = denimag; + if(b < 0) + b = -b; + if(a <= b) { + if(b == 0) + throw("complex divide"); + ratio = denreal/denimag; + denom = denreal*ratio + denimag; + quoreal = (numreal*ratio + numimag) / denom; + quoimag = (numimag*ratio - numreal) / denom; + } else { + ratio = denimag/denreal; + denom = denimag*ratio + denreal; + quoreal = (numimag*ratio + numreal) / denom; + quoimag = (numimag - numreal*ratio) / denom; + } + FLUSH(&quoreal); + FLUSH(&quoimag); +} -- cgit v1.2.3