Module:TableTools: Difference between revisions
use a hack to handle NaN values
m>Mr. Stradivarius (don't sort union and intersection functions) |
m>Mr. Stradivarius (use a hack to handle NaN values) |
||
Line 14: | Line 14: | ||
local floor = math.floor | local floor = math.floor | ||
local infinity = math.huge | local infinity = math.huge | ||
-- Define a unique value to represent NaN. This is because NaN cannot be used as a table key. | |||
local nan = {} | |||
--[[ | --[[ | ||
Line 47: | Line 50: | ||
for _, t in ipairs(tables) do | for _, t in ipairs(tables) do | ||
for k, v in pairs(t) do | for k, v in pairs(t) do | ||
if type(v) == 'number' and tostring(v) == '-nan' then | |||
v = nan -- NaN cannot be a table key, so use a proxy variable. | |||
end | |||
vals[v] = true | vals[v] = true | ||
end | end | ||
end | end | ||
for val in pairs(vals) do | for val in pairs(vals) do | ||
if val == nan then | |||
-- This ensures that we output a NaN when we had one as input, although | |||
-- they may have been generated in a completely different way. | |||
val = 0/0 | |||
end | |||
ret[#ret + 1] = val | ret[#ret + 1] = val | ||
end | end | ||
Line 71: | Line 82: | ||
for _, t in ipairs(tables) do | for _, t in ipairs(tables) do | ||
for k, v in pairs(t) do | for k, v in pairs(t) do | ||
if type(v) == 'number' and tostring(v) == '-nan' then | |||
v = nan -- NaN cannot be a table key, so use a proxy variable. | |||
end | |||
local valCount = vals[v] or 0 | local valCount = vals[v] or 0 | ||
vals[v] = valCount + 1 | vals[v] = valCount + 1 | ||
Line 77: | Line 91: | ||
for val, count in pairs(vals) do | for val, count in pairs(vals) do | ||
if count == lim then | if count == lim then | ||
if val == nan then | |||
-- This ensures that we output a NaN when we had one as input, although | |||
-- they may have been generated in a completely different way. | |||
val = 0/0 | |||
end | |||
ret[#ret + 1] = val | ret[#ret + 1] = val | ||
end | end |