Ошибка добавления Lua
Похоже, добавление Lua не работает при работе с большими числами (64-битными значениями). Я пытался вычислить следующее:
71776119061217280 + 281474976710655
или в гекса
0x00FFFFFFFFFFFF
+ 0xFF000000000000
Lua 5.1, 5.2 и 5.3 все возвращают
72057594037927936 (= 0x100000000000000)
Не нужно вынимать свой калькулятор, чтобы понять, что это неправильно. Четное число, добавленное к нечетному, не является четным числом. На самом деле, кажется, что он отключен на 1 (правильный результат - 72057594037927935). В гекса проблема еще более очевидна, так как результат должен быть 0xFFFFFFFFFFFFFF. Кто-нибудь знает, что происходит, или что я буду делать неправильно здесь?
Обновить:
Для информации, я вижу это с ZeroBrane Studio на Windows 10.
2 ответа
Вот результаты, которые я получаю, используя интерпретаторы Lua, включенные в ZeroBrane Studio для этого сценария:
print(("%.17g"):format(71776119061217280 + 281474976710655))
print(71776119061217280 + 281474976710655)
Lua 5.1 (на самом деле это интерпретатор LuaJIT):
72057594037927936
7.2057594037928e+016
Луа 5.2:
72057594037927936
7.2057594037928e+016
Lua 5.3
72057594037927936
72057594037927935
Если вы запустите это в локальной консоли в IDE, то увидите 72057594037927936
, как он использует %.17g
формат во время сериализации результатов.
Локальная консоль всегда использует интерпретатор, с которым выполняется IDE, то есть Lua 5.1 (на самом деле LuaJIT) на всех платформах, так что, возможно, отсюда и путаница с результатами. Установка интерпретатора изменяет только то, что используется для сценариев "Выполнение" и "Отладка", но не для локальной консоли (по крайней мере, в текущей версии, поскольку существуют заявки, которые могут это изменить). Это не должно влиять на всплывающую подсказку и окна стека / просмотра, так как они используют %.16g
формат, который можно изменить с помощью debugger.numformat
установка; консоль - единственное место, где %.17g
Формат используется как рекомендуемый, чтобы избежать потери точности.
Какая подрывная деятельность Луа 5.3
? Как и на Linux-машине (amd64), я получаю:
$ lua
Lua 5.3.4 Copyright (C) 1994-2017 Lua.org, PUC-Rio
> 71776119061217280 + 281474976710655
72057594037927935
>