local fsum = function(...)
local pa = {}
local paSize = 0
for a = 1, select("#", ...) do
local i, v = 1, select(a, ...)
for j = 1, paSize do
local p = pa[j]
if math.abs(v) < math.abs(p) then v, p = p, v end
local hi = v + p
local lo = p - (hi - v)
if lo ~= 0.0 then pa[i] = lo; i = i + 1 end
v = hi
end
if i <= paSize then pa[i] = v; paSize = i
else paSize = paSize + 1; pa[paSize] = v end
end
local sum = 0; for j = 1, paSize do sum = sum + pa[j] end; return sum
end
local sum = function(...)
local sum = 0
for a = 1, select("#", ...) do
local v = select(a, ...)
sum = sum + v
end
return sum
end
assert(
sum(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)
== 0.9999999999999999
)
assert(
fsum(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)
== 1.0
)