Нужны ли нецелые числа в Pixilang?

Pixilang по русски
Post Reply
User avatar
NightRadio
Site Admin
Posts: 3152
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Нужны ли нецелые числа в Pixilang?

Post by NightRadio » Fri Dec 14, 2007 2:36 pm

Сейчас у нас все числа целые.
В случаях с трансформацией и синусами используются целые числа с фиксированной точкой (24.8). Типа 1 - это 256. 2 - 512. и т.д.
В некоторых случаях это неудобно.
Кроме того, у таких чисел очень низкая точность.
Стоит ли ввести нормальные дробные числа типа (типа 25.12; 0.002 и т.д.) ?
Минус дробных чисел - тормоза на КПК. Хотя, может, это будет и незаметным.
Поделитесь вашими мыслями на этот счет.

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by Al_Rado » Sat Dec 15, 2007 11:27 am

Если барьером к применению нецелых чисел является тормознутость КПК - есть все основания их(нецелые числа) применять. Частоты процов КПК, также как и десктопов, растут как на дрожжах каждый месяц-два. Плюс их применения - "плавность" и более привычная арифметика, все-таки большинство языков программирования оперируют с дробными числами. Если вдруг, какая программа будет из-за их применения тормозить - всегда можно будет адаптировать, исходники-то открытые :)
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

goglus
Posts: 122
Joined: Tue Dec 04, 2007 4:19 pm
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by goglus » Sun Dec 16, 2007 9:16 pm

вообще похоже изначальная идея юзать pixilang на кпк тихо загибается

User avatar
NightRadio
Site Admin
Posts: 3152
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by NightRadio » Sun Dec 16, 2007 10:15 pm

Эмн.. а разве у нас такая идея? =) Pixilang работает везде - вот идея. От неё и не отказываемся вообщем-то =)

User avatar
NightRadio
Site Admin
Posts: 3152
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by NightRadio » Mon May 05, 2008 10:33 am

Вообщем, что-то я никак с мертвой точки не могу сдвинуться относительно чисел с плавающей запятой. Их поддержка параллельно с целочисленными операциями неминуемо добавит в язык путаницу с преобразованием типов. Например, числовые массивы целочисленные - придется либо вводить новый тип массивов для хранения float-значений, либо к каждому элементу массива прикручивать дополнительное поле "тип". С командами тоже не ясно: все команды принимают целочисленные параметры; вводить ли дополнительно float-версии команд, или просто конвертировать из float в int, или конвертировать из float в fixed point, или еще что-то...
Можно вообще отказаться от целых чисел и поменять их на float, но в этом случае мы потеряем скорость.
Вообщем, помогайте наводить порядок в моей голове :)

Zuf
Posts: 110
Joined: Fri Dec 21, 2007 7:30 pm
Location: Msc
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by Zuf » Tue May 06, 2008 1:49 am

NightRadio wrote:Вообщем, что-то я никак с мертвой точки не могу сдвинуться относительно чисел с плавающей запятой. Их поддержка параллельно с целочисленными операциями неминуемо добавит в язык путаницу с преобразованием типов. Например, числовые массивы целочисленные - придется либо вводить новый тип массивов для хранения float-значений, либо к каждому элементу массива прикручивать дополнительное поле "тип". С командами тоже не ясно: все команды принимают целочисленные параметры; вводить ли дополнительно float-версии команд, или просто конвертировать из float в int, или конвертировать из float в fixed point, или еще что-то...
Можно вообще отказаться от целых чисел и поменять их на float, но в этом случае мы потеряем скорость.
Вообщем, помогайте наводить порядок в моей голове :)
Сразу скажу, что отказываться от целых не стоит ;)

Ну а во-первых начнем с самого существенного - размер чисел с точкой должен быть равен размеру целых числе. Т.е. мы работает с типом float (в терминах С++), размером 32 бита. Целые числа в пикси сейчас имеют такойже размер. Это позволяет нам хранить в массиве одного размера одинаковое кочиество float и int значений.

Во-вторых, на мой взгляд, пикси очень похож на некий "высокоуровневый ассемблер". В нем нет ни локальных переменных, ни типов данных, ни даже функций и всяких других возможностей, присущих высокоуровневым языкам. Эта схожесть с ассемблером дает основание считать пиксиланг некоторым виртуальным процессором. Этот процессор на данный момент работает только с целыми, мы хотим чтобы он еще и с дробными числами работал. Как поступила на этом месте фирма Intel? Интел просто разработал дополнительный математический сопроцессор... Соотвественно у него были свои, новые комманды, не связанные с обычной целочисленной арифметикой. Почему бы и нам не поступить похожим образом? С плавающей точкой будут работать отдельные комманды. Не вижу ничего плохого в дублировании функций, скажем sin() для целых и fsinf() для float. (К слову, нечто похожее наблюдается и в OpenGL). Да и много ли функций для чисел в плавающей запятой нам нужно? Ну простая тригонометрия, ну может еще квадратный корень...

Еще раз скажу, что данные в памяти не имеют типа (как и в ассемблере), данные это просто набор битов, и эти биты уже интерпретируются исходя из того как к ним обращаются.
Остается еще одна существенная проблема. Как быть с обычными арифметическими операторами?
У нас нету типа данных и простые арифметические операторы не определяют тип операции (как в это происходит в ассемблере).

Code: Select all

a=3.14 // допустим это число с плавающей точкой
b=10 // а это простое целое
c = a/b // тогда что  происходит здесь?
Для дальнейшей дискуссии предлагаю немного кривой, промежуточный вариант.
Считать все операции целыми, если только специально не указано обратное.
А дополнительным ключевым словом задавать тип операции.
Ну что то вроде такого:

Code: Select all

a = 7 // целое
b = 5.25 // float. Определяется наличием точки. Можно еще добалять f на конце, для совместимости с С. (b = 5.25f)
my_decimal = a/b // это целое, при этом число 5.25 интерпретируется неверно, оно становится просто набором битов
my_wrong_float = (float) a/b // все операнды трактуются как float. В этом случае неправильно интерпретируется операнд a

a_float = itof(a) // Конвертируем целое число в число с плавающей точкой
my_float = (float) float/b // Вот теперь это полностью корректная операция над операндами с плавающей запятой

// Как вариант записи выражений с float'ами:
another_int = ftoi(float{3.14 * float + float }) + 12
// В данном выражении, в конструкции float{3.14 * float + float } между фигурными скобками
// все операнды интерпретируются как float,
// затем результат этой конструкции конвертируется в int функцией ftoi().
// Ну и в конце прибаляется целое число 12
P.S. Извиняюсь за такой сумбурный поток сознания, время уже позднее, а судьба нецелых чисел в пикси мне очень небезразлична. Решение, мной предложенное, конечно не лучшее, но она довольно простое и будет незаметно для пользователей, которым не нужны float'ы.

User avatar
NightRadio
Site Admin
Posts: 3152
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by NightRadio » Tue May 06, 2008 7:03 am

Спасибо за интересные и полезные идеи. Нечто похожее мне пришло в голову вчера вечером :) Вот теперь ход дальнейших дествий более определенный...
На счет "высокоуровневого ассемблера" точно подмечено. Более того, Pixilang2, который я сейчас отлаживаю, на лету преобразовывает каждую команду пикси-программы в набор native ассемблерных инструкций. То есть, расстояние от Пикси до машинного кода с каждым днем все меньше :)

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by Al_Rado » Tue May 06, 2008 12:53 pm

Полностью поддерживаю идею оставить операторы с целыми числами!
Кому нужны нецелые, будут пользоваться дополнительными операторами
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

Zuf
Posts: 110
Joined: Fri Dec 21, 2007 7:30 pm
Location: Msc
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by Zuf » Mon May 12, 2008 1:28 pm

Одна вещь, о которой я все хотел сказать, но както не получалось ;)

Хочу сказать о "неравномерности" использования чисел с фиксированной точкой в тригонометрических чункция пиксиланга.
Возьмам функцию sin(alpha). Эта функция возвращает значения в диапазоне [-256; 256]. Т.е. 1.0 у нас эквивалентна 256.
Однако, параметр aplha меняется от 0 до 512. При 512 обозначает число Пи (3.14159...).
Имеем неприятный эффект, когда alpha равное 256, используемое в качестве аргумента sin() или cos() представляет собой число pi/2 (приблизительно 1.57). А если использовать это число в обычном арифметическом выражении, в качестве числа с фиксированной точкой, то 256 эквивалентно 1.0.

Думаю это еще один аргумент в пользу настоящих "нецелых" чисел ;)

P.S. Конечно я понимаю откуда взялись цыфры 512, 256 и т.д., и почему так сделано. Но факт остается фактом...

User avatar
NightRadio
Site Admin
Posts: 3152
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Нужны ли нецелые числа в Pixilang?

Post by NightRadio » Mon May 12, 2008 8:18 pm

Согласен :) Функции синуса и косинуса делались скорее с целью упростить написание эффектов плазмы, нежели для математических вычислений :)
После введения нецелых чисел я просто добавлю команды fsin, fcos, и по крайней мере проблемы точных вычислений решатся.

Post Reply