unitpoint / objectscript

ObjectScript, OS for short, is a new programming language. It's free, cross-platform, lightweight, embeddable and open-source. It combines the benefits of multiple languages, including: JavaScript, Lua, Ruby, Python and PHP. OS features the syntax of Javascripts, the "multiple results" feature from lua, syntactic shugar from Ruby as well as magic methods from PHP and Ruby - and even more!
http://objectscript.org
Other
70 stars 19 forks source link

целые числа #29

Closed Dreamer-other closed 10 years ago

Dreamer-other commented 10 years ago

привет! как я понял из документации для представления чисел есть только один тип Number и внутри он является double. как быть если мне нужен обычный 32х разрядный int, аналогичный тому что в C++?

unitpoint commented 10 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")

Dreamer-other commented 10 years ago

Мне нужно было реализовать несколько целочисленных алгоритмов, там используется тип int32, арифметика и bitwise операции т.п. Т. е. мне нужно было добиться идентичности результатов выполнения на OS и С++ одного алгоритма, я попытался, но к сожалению с double это было проблематично. Поэтому выбрал Squirrel где есть int32, хотя ваш язык мне показался более привлекательным. Советую подумать над введением стандартных целочисленных типов. Можно это сделать отдельным модулем как numpy в питоне.

unitpoint commented 10 years ago

Можете показать некоторые моменты из алгоритма, которые вызвали сложности при его реализации на OS?

P.S. кстати самый простой способ преобразовать в int это использовать конструкцию (val|0), где val - некоторая переменные с числом. Работает это потому что в побитовых операциях число автоматически преобразуется в целое. Этот способ я видел в библиотеках на javascript, на OS он тоже будет работать, при этом быстрее, чем math.floor

Dreamer-other commented 10 years ago

Вот для этого алогритма не получилось добиться соответствия результата с реализацией на C++, а мне важно именно полное соответствие: mw = ; /* must not be zero, nor 0x464fffff / mz = ; / must not be zero, nor 0x9068ffff */

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 */ }

unitpoint commented 10 years ago

Ага, это уже интересно! Я закомитил обновление 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());
}