[pypy-commit] extradoc extradoc: refactor sqrt lua benchmark. integer and Fix16 variants probably don't quite
cfbolz
noreply at buildbot.pypy.org
Mon Aug 13 21:12:14 CEST 2012
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: extradoc
Changeset: r4550:5b523c603fdb
Date: 2012-08-13 21:10 +0200
http://bitbucket.org/pypy/extradoc/changeset/5b523c603fdb/
Log: refactor sqrt lua benchmark. integer and Fix16 variants probably
don't quite make sense.
diff --git a/talk/iwtc11/benchmarks/sqrt/sqrt.lua b/talk/iwtc11/benchmarks/sqrt/sqrt.lua
--- a/talk/iwtc11/benchmarks/sqrt/sqrt.lua
+++ b/talk/iwtc11/benchmarks/sqrt/sqrt.lua
@@ -1,89 +1,106 @@
+local bit = require("bit")
+local lshift, rshift, tobit = bit.lshift, bit.rshift, bit.tobit
+
+if true then
+ function rshift(a, b)
+ return a / (2 ^ b)
+ end
+
+ function lshift(a, b)
+ return a * (2 ^ b)
+ end
+
+ function tobit(a)
+ return a
+ end
+end
+
+---------------------------
+
function sqrt(y, n)
- n = n or 10000
- x = y / 2
- while n > 0 do
- n = n - 1
- x = (x + y/x) / 2
- end
- return x
+ n = n or 10000
+ local x = y / 2
+ while n > 0 do
+ n = n - 1
+ x = (x + y/x) / 2
+ end
+ return x
end
-----------------------
-- begin class Fix16 --
-----------------------
-Fix16 = {}
+Fix16 = {
+ new = function(self, val, scale)
+ if scale == nil then
+ scale = true
+ end
+
+ if type(val) == "table" then
+ val = val.val
+ else
+ if scale == true then
+ val = lshift(val, 16)
+ else
+ val = tobit(val)
+ end
+ end
+ return setmetatable({val=val}, self)
+ end,
+
+ __add = function(self, other)
+ return Fix16:new(self.val + Fix16:new(other).val, false)
+ end,
+
+ __mul = function(self, other)
+ local value = rshift(self.val, 8) * (rshift(Fix16:new(other).val, 8))
+ return Fix16:new(value, false)
+ end,
+
+ __div = function(self, other)
+ local value = lshift(self.val, 8) / (rshift(Fix16:new(other).val, 8))
+ return Fix16:new(value, false)
+ end,
+
+ to_float = function(self)
+ return self.val / (2 ^ 16)
+ end,
+
+ __tostring = function(self)
+ return tostring(self:to_float())
+ end,
+}
Fix16.__index = Fix16
-function Fix16.init(val, scale)
- if scale == nil then
- scale = true
- end
-
- local fix16 = {}
- setmetatable(fix16, Fix16)
- if type(val) == "table" then
- fix16.val = val.val
- else
- if scale == true then
- fix16.val = math.floor(val * (2 ^ 16))
- else
- fix16.val = val
- end
- end
- return fix16
-end
-
-function Fix16:__add(other)
- return Fix16.init(self.val + Fix16.init(other).val, false)
-end
-
-function Fix16:__mul(other)
- value = (self.val / 256) * (Fix16.init(other).val / 256)
- return Fix16.init(value, false)
-end
-
-function Fix16:__div(other)
- value = (self.val * 256) / (Fix16.init(other).val / 256)
- return Fix16.init(value, false)
-end
-
-function Fix16:to_float()
- return self.val / (2 ^ 16)
-end
-
-function Fix16:__tostring()
- return tostring(self:to_float())
-end
-
---------------------
-- end class Fix16 --
---------------------
function test_sqrt()
- t = {2, 3, 4, 5, 6, 7, 8, 9, 123}
- for j = 1, #t do
- i = t[j]
- s = string.format("%d %f %4.2f %4.2f %4.2f", i, sqrt(i), sqrt(i), sqrt(Fix16.init(i)):to_float(), math.sqrt(i))
- print(s)
- end
+ t = {2, 3, 4, 5, 6, 7, 8, 9, 123}
+ for j = 1, #t do
+ i = t[j]
+ s = string.format("%d %f %f %f %f", i, sqrt(i), sqrt(tobit(i)), sqrt(Fix16:new(i)):to_float(), math.sqrt(i))
+ print(s)
+ end
end
-- entry point
function main(args)
- arg = args[1]
- if arg == "int" then
- sqrt(123, 100000000)
- elseif arg == "float" then
- sqrt(123, 100000000)
- elseif arg == "Fix16" then
- sqrt(Fix16.init(123), 100000000)
- elseif arg == "test_sqrt" then
- test_sqrt()
- else
- error('argument must be "int", "float" or "Fix16"')
- end
- return string.format("%s", arg)
+ arg = args[1]
+ if arg == "int" then
+ sqrt(123, 100000000)
+ elseif arg == "float" then
+ sqrt(123, 100000000)
+ elseif arg == "Fix16" then
+ sqrt(Fix16:new(123), 100000000)
+ elseif arg == "test_sqrt" then
+ test_sqrt()
+ else
+ error('argument must be "int", "float" or "Fix16"')
+ end
+ return string.format("%s", arg)
end
---main(arg)
+main(arg)
More information about the pypy-commit
mailing list