diff --git a/TensorFlow/tf4pi.html b/TensorFlow/tf4pi.html
new file mode 100644
index 0000000000000000000000000000000000000000..5ad0418cb4ee30594b3fc84315ed6e1ac4f8ad73
--- /dev/null
+++ b/TensorFlow/tf4pi.html
@@ -0,0 +1,64 @@
+<html>
+<body>
+<script src=tf.min.js></script>
+<script>
+//
+// tf4pi.html
+// Neil Gershenfeld 11/18/18
+// Ann Yuan 12/4/18
+// TensorFlow.js pi calculation benchmark
+// pi = 3.14159265358979323846
+//
+
+const points = 1e10;
+const a = tf.scalar(0.5)
+const b = tf.scalar(0.75)
+const c = tf.scalar(0.25)
+
+const indicesPerTexel = 1000;
+const outputSize = points / indicesPerTexel;
+
+const divMulIndexSubProgram = {
+  variableNames: ['X', 'Y', 'Z'],
+  outputShape: [outputSize],
+  userCode: `
+    float compute(float i) {
+      return 0.5 / ((i - 0.75) * (i - 0.25));
+    }
+
+    void main() {
+      float i = float(getOutputCoords());
+      float sum = 0.;
+      for(int index=0; index<${indicesPerTexel}; index++) {
+        sum += compute(float(i * ${indicesPerTexel}. + float(index)));
+      }
+      setOutput(sum);
+    }
+  `
+}
+
+function divMulIndexSub(x, y, z) {
+  return tf.ENV.backend.compileAndRun(divMulIndexSubProgram, [x, y, z]);
+}
+
+function f() {
+  const product = divMulIndexSub(b, c, a);
+
+  return tf.sum(product).dataSync();
+}
+
+// Warmup
+f();
+
+const tstart = performance.now() / 1000
+const sum = f();
+const tend = performance.now() / 1000
+const mflops = outputSize * 5.0 * indicesPerTexel * 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>
+