Ошибка добавления Lua

Похоже, добавление Lua не работает при работе с большими числами (64-битными значениями). Я пытался вычислить следующее:

71776119061217280 + 281474976710655

или в гекса

  0x00FFFFFFFFFFFF‬
+ 0x‭FF000000000000

Lua 5.1, 5.2 и 5.3 все возвращают

72057594037927936 (= 0x‭100000000000000)

Не нужно вынимать свой калькулятор, чтобы понять, что это неправильно. Четное число, добавленное к нечетному, не является четным числом. На самом деле, кажется, что он отключен на 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
>
Другие вопросы по тегам