diff --git a/TensorFlow/tf1pi.html b/TensorFlow/tf1pi.html
index e8e0513a2c741e24dc6652d7775d8266b24a48bd..35fd59051d92adab90e47a622dac015d1cb814ac 100644
--- a/TensorFlow/tf1pi.html
+++ b/TensorFlow/tf1pi.html
@@ -3,7 +3,7 @@
 <script src=tf.min.js></script>
 <script>
 //
-// tfpi.html
+// tf1pi.html
 // Neil Gershenfeld 11/18/18
 // Nikhil Thorat 11/20/18
 // TensorFlow.js pi calculation benchmark
diff --git a/TensorFlow/tf2pi.html b/TensorFlow/tf2pi.html
index f1c5097686501792e3fa36b57725aa9307cd357b..a66c38e002fdeee5791a6d6b2ddceee334dd5f36 100644
--- a/TensorFlow/tf2pi.html
+++ b/TensorFlow/tf2pi.html
@@ -3,7 +3,7 @@
 <script src=tf.min.js></script>
 <script>
 //
-// tfpi.html
+// tf2pi.html
 // Neil Gershenfeld 11/18/18
 // Nikhil Thorat 11/20/18
 // TensorFlow.js pi calculation benchmark
diff --git a/TensorFlow/tf3pi.html b/TensorFlow/tf3pi.html
new file mode 100644
index 0000000000000000000000000000000000000000..933036d361ccabc41ce477a71f61f7e890c9b64a
--- /dev/null
+++ b/TensorFlow/tf3pi.html
@@ -0,0 +1,62 @@
+<html>
+<body>
+<script src=tf.min.js></script>
+<script>
+//
+// tf3pi.html
+// Neil Gershenfeld 11/18/18
+// Ann Yuan 11/30/18
+// TensorFlow.js pi calculation benchmark
+// pi = 3.14159265358979323846
+//
+const points = 1e7
+const a = tf.scalar(0.5)
+const b = tf.scalar(0.75)
+const c = tf.scalar(0.25)
+
+const batchSize = 100;
+const computeSum = [];
+
+for(let i=1; i<batchSize; i++) {
+  computeSum.push(`compute(i * ${batchSize}. + ${i}.)`);
+}
+
+const divMulIndexSubProgram = {
+  variableNames: ['a', 'b', 'c'],
+  outputShape: [points / batchSize],
+  userCode: `
+    float compute(float i) {
+      return a / ((i - b) * (i - c));
+    }
+
+    void main() {
+      float i = float(getOutputCoords());
+      setOutput(${computeSum.join(' + ')});
+    }
+  `
+}
+
+function divMulIndexSub(x, y, z) {
+  return tf.ENV.backend.compileAndRun(divMulIndexSubProgram, [a, b, c]);
+}
+
+function f() {
+  return tf.sum(divMulIndexSub(b, c, a)).dataSync();
+}
+
+// Warmup
+f()
+
+const tstart = performance.now()/1000
+//const sum = tf.range(1,points)
+const sum = f()
+//const sum = f();
+const tend = performance.now()/1000
+const mflops = points*5.0*1e-6/(tend-tstart);
+document.write('pi: '+sum.toString())
+document.write('<br>')
+document.write('time: '+(tend-tstart)+'s')
+document.write('<br>')
+document.write('estimated MFlops: '+mflops)
+</script>
+