changed 5 years ago
Published Linked with GitHub

Lua numbers in Tarantool

Igor Munkin

Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- <result>
...


Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- true
...


Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- true
...

tarantool> 2^52 == 2^52 + 1
–––
- <result>
...


Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- true
...

tarantool> 2^52 == 2^52 + 1
–––
- false
...


Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- true
...

tarantool> 2^52 == 2^52 + 1
–––
- false
...

tarantool> 2^53 == 2^53 + 1
–––
- <result>
...


Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- true
...

tarantool> 2^52 == 2^52 + 1
–––
- false
...

tarantool> 2^53 == 2^53 + 1
–––
- true
...


Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- true
...

tarantool> 2^52 == 2^52 + 1
–––
- false
...

tarantool> 2^53 == 2^53 + 1
–––
- true
...

tarantool> 2^53 == 2^53 + 2
–––
- <result>
...


Problem #1


tarantool> 2^52 == 2^52 + 0.5
–––
- true
...

tarantool> 2^52 == 2^52 + 1
–––
- false
...

tarantool> 2^53 == 2^53 + 1
–––
- true
...

tarantool> 2^53 == 2^53 + 2
–––
- false
...


Effect #1.1


tarantool> box.cfg{} <snip> box.space.s:create_index('i')
–––
- <snip>
...


Effect #1.1


tarantool> box.cfg{} <snip> box.space.s:create_index('i')
–––
- <snip>
...

tarantool> box.space.s:insert({2^53})
–––
- <result>
...


Effect #1.1


tarantool> box.cfg{} <snip> box.space.s:create_index('i')
–––
- <snip>
...

tarantool> box.space.s:insert({2^53})
–––
- [9007199254740992]
...


Effect #1.1


tarantool> box.cfg{} <snip> box.space.s:create_index('i')
–––
- <snip>
...

tarantool> box.space.s:insert({2^53})
–––
- [9007199254740992]
...

tarantool> box.space.s:insert({2^53 + 1})
–––
- <result>
...


Effect #1.1


tarantool> box.cfg{} <snip> box.space.s:create_index('i')
–––
- <snip>
...

tarantool> box.space.s:insert({2^53})
–––
- [9007199254740992]
...

tarantool> box.space.s:insert({2^53 + 1})
–––
- error: Duplicate key exists in unique index 'i' in space 's'
...


Effect #1.2


tarantool> box.space.s:select({2^53})
–––
- <result>
...


Effect #1.2


tarantool> box.space.s:select({2^53})
–––
- [9007199254740992]
...


Effect #1.2


tarantool> box.space.s:select({2^53})
–––
- [9007199254740992]
...

tarantool> box.space.s:select({2^53 + 1})
–––
- <result>
...


Effect #1.2


tarantool> box.space.s:select({2^53})
–––
- [9007199254740992]
...

tarantool> box.space.s:select({2^53 + 1})
–––
- [9007199254740992]
...


WAT #1


tarantool> type(box.space.s:select({2^53})[1])
–––
- <result>
...


WAT #1


tarantool> type(box.space.s:select({2^53})[1])
–––
- cdata
...


WAT #1


Workaround #1


tarantool> 9007199254740992ULL
–––
- <result>
...


Workaround #1


tarantool> 9007199254740992ULL
–––
- 9007199254740992
...


Workaround #1


tarantool> 9007199254740992ULL
–––
- 9007199254740992
...

tarantool> type(9007199254740992ULL)
–––
- <result>
...


Workaround #1


tarantool> 9007199254740992ULL
–––
- 9007199254740992
...

tarantool> type(9007199254740992ULL)
–––
- cdata
...


Workaround #1


tarantool> 9007199254740992ULL
–––
- 9007199254740992
...

tarantool> type(9007199254740992ULL)
–––
- cdata
...

tarantool> 9007199254740992ULL + 1
–––
- <result>
...


Workaround #1


tarantool> 9007199254740992ULL
–––
- 9007199254740992
...

tarantool> type(9007199254740992ULL)
–––
- cdata
...

tarantool> 9007199254740992ULL + 1
–––
- 9007199254740993
...


Workaround #1


tarantool> 9007199254740992ULL + 1
–––
- 9007199254740993
...

tarantool> 9007199254740992ULL == 9007199254740992ULL + 1
–––
- <result>
...


Workaround #1


tarantool> 9007199254740992ULL + 1
–––
- 9007199254740993
...

tarantool> 9007199254740992ULL == 9007199254740992ULL + 1
–––
- false
...


Workaround #1


tarantool> 9007199254740992ULL + 1
–––
- 9007199254740993
...

tarantool> 9007199254740992ULL == 9007199254740992ULL + 1
–––
- false
...

tarantool> 9007199254740992ULL == 9007199254740992ULL + 0.5
–––
- <result>
...


Workaround #1 (?)


tarantool> 9007199254740992ULL + 1
–––
- 9007199254740993
...

tarantool> 9007199254740992ULL == 9007199254740992ULL + 1
–––
- false
...

tarantool> 9007199254740992ULL == 9007199254740992ULL + 0.5
–––
- true
...


Workaround #1 (?)


tarantool> 9007199254740992ULL == 9007199254740992ULL + 1
–––
- false
...

tarantool> 9007199254740992ULL == 9007199254740992ULL + 0.5
–––
- true
...

tarantool> 9007199254740992ULL + 0.5
–––
- 9007199254740992
...


Problem #2


tarantool> 9007199254740992ULL < 9007199254740992ULL + 1
–––
- <result>
...


Problem #2


tarantool> 9007199254740992ULL < 9007199254740992ULL + 1
–––
- true
...


Problem #2


tarantool> 9007199254740992ULL < 9007199254740992ULL + 1
–––
- true
...

tarantool> 9007199254740992ULL < -1
–––
- <result>
...


Problem #2


tarantool> 9007199254740992ULL < 9007199254740992ULL + 1
–––
- true
...

tarantool> 9007199254740992ULL < -1
–––
- true
...


Effect #2


tarantool> box.cfg{listen = 3313} <snip> c = nb.connect(box.cfg.listen)
<snip>
–––
...


Effect #2


tarantool> box.cfg{listen = 3313} <snip> c = nb.connect(box.cfg.listen)
<snip>
–––
...

tarantool> t = {} for _ = 1, 10 do
         >   table.insert(t,
         >     c:execute('SELECT random()').rows[1]
         >       :totable()[1]
         >   )
         > end
–––
...


Effect #2


tarantool> box.cfg{listen = 3313} <snip> c = nb.connect(box.cfg.listen)
<snip>
–––
...

tarantool> t = {} for _ = 1, 10 do
         >   table.insert(t,
         >     c:execute('SELECT random()').rows[1]
         >       :totable()[1]
         >   )
         > end
–––
...

tarantool> table.sort(t)
–––
...


Effect #2


tarantool> t
–––
- <result>
...


Effect #2


tarantool> t
–––
- - 1064442337705904389
  - 5430535088656468933
  - 8084626668617668138
  - -7957167126669429942
  - -6755436305203424895
  - -6476727283901405634
  - -5944830508420504980
  - -2428743323307643782
  - -1162597621816885600
  - -108704732427766924
...


Long story short

  • Native Lua numeric type

    • Lack of precision for several groups of numbers
  • FFI cdata numeric types

    • 64-bit integer promotion and cast rules according to C standard

Odd arithmetics for both existing numeric types


Bonus tracks

Select a repo