Closed Dreamer-other closed 11 years ago
Здравствуйте, Вы верно подметили, числа в языке представлены только одним типом Number. Обычно это не составляет проблем. Один числовой тип представлен во многих скриптовых языках, например, javascript, lua и др. Если Вам нужно при делении получать целое, то достаточно воспользоваться функций math.floor, если нужно запаковать в бинарные данные или считать число из бинарных данных, то можно использовать функции String.pack/String.unpack (в файле https://github.com/unitpoint/objectscript/blob/master/examples-os/test.os есть пример использования, поищите фразу "Test pack/unpack")
Мне нужно было реализовать несколько целочисленных алгоритмов, там используется тип int32, арифметика и bitwise операции т.п. Т. е. мне нужно было добиться идентичности результатов выполнения на OS и С++ одного алгоритма, я попытался, но к сожалению с double это было проблематично. Поэтому выбрал Squirrel где есть int32, хотя ваш язык мне показался более привлекательным. Советую подумать над введением стандартных целочисленных типов. Можно это сделать отдельным модулем как numpy в питоне.
Можете показать некоторые моменты из алгоритма, которые вызвали сложности при его реализации на OS?
P.S. кстати самый простой способ преобразовать в int это использовать конструкцию (val|0), где val - некоторая переменные с числом. Работает это потому что в побитовых операциях число автоматически преобразуется в целое. Этот способ я видел в библиотеках на javascript, на OS он тоже будет работать, при этом быстрее, чем math.floor
Вот для этого алогритма не получилось добиться соответствия результата с реализацией на C++, а мне важно именно полное соответствие:
mw =
uint get_random() { m_z = 36969 * (m_z & 65535) + (m_z >> 16); m_w = 18000 * (m_w & 65535) + (m_w >> 16); return (m_z << 16) + m_w; /* 32-bit result */ }
Ага, это уже интересно! Я закомитил обновление 1.8.1-dev для правильной работы с большими целыми числами и проверил на следующем примере (работает идентично коду на C++):
var m_w = 10; /* must not be zero, nor 0x464fffff */
var m_z = 20; /* must not be zero, nor 0x9068ffff */
function get_random()
{
m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & 0xffffffff;
m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & 0xffffffff;
return ((m_z << 16) + m_w) & 0xffffffff; /* 32-bit result */
}
for(var i = 0; i < 10; i++){
printf("%d => %d\n", i, get_random());
}
привет! как я понял из документации для представления чисел есть только один тип Number и внутри он является double. как быть если мне нужен обычный 32х разрядный int, аналогичный тому что в C++?