summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/complex.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/complex.c')
-rw-r--r--src/pkg/runtime/complex.c36
1 files changed, 36 insertions, 0 deletions
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);
+}