Я хочу использовать lua (который внутренне использует только двойные числа) для представления целого числа, которое не может иметь ошибок округления от 0 до 2 ^ 64-1, иначе произойдут ужасные вещи.
Возможно ли это сделать?
Я хочу использовать lua (который внутренне использует только двойные числа) для представления целого числа, которое не может иметь ошибок округления от 0 до 2 ^ 64-1, иначе произойдут ужасные вещи.
Возможно ли это сделать?
Нет
По крайней мере, некоторые биты 64-битного двойного числа должны использоваться для представления экспоненты (положения двоичной точки), и, следовательно, для фактического числа доступно менее 64 бит. Так что нет, 64-битный двойник не может представлять все значения, которые могут быть представлены 64-битным целым числом (и наоборот).
Несмотря на то, что вы получили несколько хороших ответов на свой вопрос о 64-битных типах, вам может понадобиться практическое решение вашей конкретной проблемы. Самое надежное известное мне решение — собрать Lua 5.1 с патчем LNUM (также известным как целочисленный патч Lua), который можно загрузить с LuaForge. Если вы не планируете собирать Lua из исходного кода C, существует по крайней мере одна чистая библиотека Lua, которая обрабатывает 64-битные целые числа со знаком — см. вики Lua-users.
Двойник сам по себе является 64-битным типом. Однако вы теряете 1 бит для знака и 11 для экспоненты.
Так что ответ нет: это невозможно сделать.
total_bits - sign_bit - exp_bits + implicit_bit = 64 - 1 - 11 + 1 = 53
- person Christoph; 24.11.2009
По памяти double
может точно представлять 53-битное целое число со знаком.
Нет, вы не можете использовать Double для хранения 64-битных целых чисел без потери точности.
Однако вы можете применить патч Lua, который добавляет поддержку истинных 64-битных целых чисел в интерпретатор Lua. Примените патч LNUM к исходному коду Lua и перекомпилируйте.
На 64 битах вы можете хранить только 2^64 разных кода. Это означает, что 64-битный тип, который может представлять 2^64 целых числа, не имеет места для представления чего-либо еще, например чисел с плавающей запятой.
Очевидно, что double может представлять множество нецелых чисел, поэтому он не может соответствовать вашим требованиям.
IEEE 754 double не может точно представлять 64-битные целые числа. Однако он может точно представлять каждое 32-битное целое число.
я ничего не знаю о lua
, но если бы вы могли понять, как выполнять побитовые манипуляции с числом с плавающей запятой на этом языке, вы могли бы теоретически создать класс-оболочку, который принимал бы ваше число в виде строки и устанавливал бы биты float в порядке, который представляет число, которое вы ему дали
более практичным решением было бы использовать какую-нибудь библиотеку bignum