- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
int spectrumColor(float magn)
{
if (magn != magn) return 0xFF000000;
if ((magn <= -FLT_MAX && magn >= FLT_MAX)) return 0xFF000000;
const float minRange = -95.0f;
if (magn > minRange && magn <= (minRange + 10.0f))
return blendColor(0, 0x00004f, (magn - minRange) / 10.0f);
if (magn > (minRange + 10.0f) && magn <= (minRange + 20.0f))
return blendColor(0x00004f, 0x50007b, (magn - (minRange + 10.0f)) / 10.0f);
if (magn > (minRange + 20.0f) && magn <= (minRange + 30.0f))
return blendColor(0x50007b, 0x990076, (magn - (minRange + 20.0f)) / 10.0f);
if (magn > (minRange + 30.0f) && magn <= (minRange + 40.0f))
return blendColor(0x990076, 0xd20040, (magn - (minRange + 30.0f)) / 10.0f);
if (magn > (minRange + 40.0f) && magn <= (minRange + 50.0f))
return blendColor(0xd20040, 0xf51f00, (magn - (minRange + 40.0f)) / 10.0f);
if (magn > (minRange + 50.0f) && magn <= (minRange + 60.0f))
return blendColor(0xf51f00, 0xffaa00, (magn - (minRange + 50.0f)) / 10.0f);
if (magn > (minRange + 60.0f) && magn <= (minRange + 70.0f))
return blendColor(0xffaa00, 0xfff966, (magn - (minRange + 60.0f)) / 10.0f);
if (magn > (minRange + 70.0f) && magn <= (minRange + 80.0f))
return blendColor(0xfff966, 0xffffff, (magn - (minRange + 70.0f)) / 10.0f);
if (magn < minRange) return 0xFF000000;
if (magn >= (minRange + 80.0f)) return 0xFFFFFFFF;
return 0xFF000000;
}
Вот так в одной говноподелке считается цвет столбцов спектра для визуализации аудио.
Lander 26.03.2013 08:38 # −4
Вообщем то первая же строчка меня и убила :)
krypt 26.03.2013 09:06 # +8
http://ru.wikipedia.org/wiki/NaN
Lander 26.03.2013 09:56 # 0
wvxvw 26.03.2013 13:21 # 0
LispGovno 26.03.2013 13:32 # 0
bormand 26.03.2013 13:38 # +2
wvxvw 26.03.2013 13:42 # 0
Т.е. если уж мы определили для него операцию, то оно должно быть числом, либо тогда уже не нужно было для него определять такую операцию. Смысл-то в том, что класс равенства нельзя определить так, чтобы выполнялось a != a, а что такое а - это уже в руке аллаха.
wvxvw 26.03.2013 13:56 # 0
bormand 26.03.2013 15:30 # +1
Именно так.
> с плавающей запятой даже. ;)
И далеко эта запятая уплыла? В нем нет ни мантиссы ни порядка, это сложно назвать числом.
А насчет неравенства NaN != NaN - NaNы бывают разные, поэтому, чтобы не запутывать логику, все NaNы не равны друг другу.
wvxvw 26.03.2013 15:38 # 0
wvxvw 26.03.2013 15:52 # 0
Но это создает противоречие, когда мы спрашиваем "а разные ли?" и вдруг получаем утвердительный ответ.
roman-kashitsyn 26.03.2013 15:57 # +5
Lure Of Chaos 26.03.2013 23:28 # 0
wvxvw 26.03.2013 23:46 # 0
Lure Of Chaos 27.03.2013 05:38 # 0
bormand 27.03.2013 09:03 # +1
Lure Of Chaos 27.03.2013 09:36 # 0
defecate-plusplus 27.03.2013 09:37 # +5
bormand 27.03.2013 09:47 # 0
bormand 27.03.2013 09:50 # 0
Если подойти к этой фразе формально - x || !x, что всегда истинно. Поэтому ответом будет "да".
eth0 27.03.2013 19:39 # 0
bormand 27.03.2013 19:40 # 0
TarasB 28.03.2013 09:22 # 0
Я хочу без исключений узнать, даст ли операция корректный результат. Сейчас способ есть - выполнить операцию и проверить результат на корректность. Всё это в режиме сопроцессора "не кидать исключения".
wvxvw 28.03.2013 11:16 # 0
Просто есть такая тенденция в проектировании: сначала спроектировать все так, как будто оно всегда работает безотказно, а потом думать, что же делать, когда не работает.
roman-kashitsyn 28.03.2013 13:00 # +1
Вам в Go, товарищ, только одна проблема (для тебя): там есть сборщик мусора.
TarasB 28.03.2013 13:02 # 0
3.14159265 28.03.2013 14:09 # 0
TarasB 28.03.2013 14:11 # 0
defecate-plusplus 28.03.2013 14:50 # +2
TarasB 28.03.2013 15:41 # +1
defecate-plusplus 28.03.2013 15:59 # 0
но с++ позволит завести переменную одного типа - например, кортеж из типа1 и типа2, из которого ты потом получишь обе части - см. std::pair или более общий std::tuple
std::tie связывает _существующие_ переменные
roman-kashitsyn 28.03.2013 16:08 # 0
go может и типы выводит. Допустим, есть функция (берёт 2 инта, возвращает int и error), стейтмент
создаст две переменные разных типов. Можно ещё так: Без шаблонов как-то оно грустновато, хоть язык довольно интересный, и стандартная либа доставляет.
defecate-plusplus 28.03.2013 16:16 # 0
почему они не подумали о тарасе?
roman-kashitsyn 28.03.2013 16:23 # 0
Семантика немного сложнее (:= создаёт как минимум одну новую переменную, остальные может поменять, если они не в новом скопе), но суть такая. Тут каким-то местом замешан оберон, но я не знаю оный, и мне сложно судить.
TarasB 28.03.2013 16:09 # 0
Вот я и говорю, как ты в этом крестоблядском убогом недоязыке, базирующемся на допотопном недоассемблере, заведёшь в одной строке две переменные разных типов, как
file,err := os.Open("file.go")
?
LispGovno 28.03.2013 15:59 # 0
LispGovno 28.03.2013 16:00 # 0
Abbath 28.03.2013 15:02 # +1
TarasB 28.03.2013 15:42 # +2
Abbath 28.03.2013 18:13 # 0
krypt 26.03.2013 09:07 # 0
guest 26.03.2013 13:57 # 0
just_nameless 26.03.2013 15:05 # 0
just_nameless 26.03.2013 15:15 # 0
defecate-plusplus 26.03.2013 15:19 # 0
just_nameless 26.03.2013 15:27 # 0
В общем-то задача состоит в том, чтобы сделать преобразование амплитуды в цвет, как вот на этой картинке: http://upload.wikimedia.org/wikipedia/commons/c/c5/Spectrogram-19thC.png
wvxvw 26.03.2013 15:33 # 0
just_nameless 26.03.2013 15:36 # 0
wvxvw 26.03.2013 15:39 # 0
bormand 26.03.2013 15:41 # +1
Так передайте ему 2 цвета из таблички: [index] и [index+1] и (magn + 95.0) / 10.0 - index в качестве третьего аргумента.
bormand 26.03.2013 15:38 # +1
wvxvw 26.03.2013 15:41 # 0
defecate-plusplus 26.03.2013 15:36 # 0
2 случая меньше и больше этого отрезка останется рассмотреть отдельно
как-то так
just_nameless 26.03.2013 15:42 # 0
defecate-plusplus 26.03.2013 15:43 # +2
неужели сам не видишь никаких закономерностей в копипастных строчках?
just_nameless 26.03.2013 15:46 # 0
просто подумал, что меня неправильно поняли
bormand 26.03.2013 15:43 # 0
TarasB 27.03.2013 10:56 # +2
я тоже быдо и делаю ифами
аж целых 5 ифов, дааа
а, не, 4
bormand 27.03.2013 18:58 # 0
bormand 27.03.2013 19:05 # 0
LispGovno 27.03.2013 19:10 # 0
bormand 27.03.2013 19:13 # 0
bormand 27.03.2013 19:28 # 0
bormand 27.03.2013 20:59 # 0
TarasB 28.03.2013 09:24 # 0
bormand 28.03.2013 10:21 # 0
Код Тараса без модификаций - 2.6с.
Мой код с floor(e*(5*256)) - 1.8с.
Если убрать проверку index<0, время увеличивается до 3.4с. Вторая проверка на время не влияет.
TarasB 28.03.2013 10:23 # 0
bormand 28.03.2013 10:29 # 0
bormand 28.03.2013 10:35 # 0
P.S. 1.7 секунд выполняется int index = (int)(e*(5*256)), остальное в пределах погрешности.
bormand 28.03.2013 10:44 # 0
TarasB 28.03.2013 10:51 # 0
bormand 28.03.2013 10:57 # 0
TarasB 28.03.2013 11:09 # 0
bormand 28.03.2013 10:51 # 0
http://gcc.gnu.org/ml/gcc/2001-10/msg01039.html
Unfortunately, I've noticed that casting from float/double to int on i386 can cause large performance hits when this operations is used often.
bormand 28.03.2013 13:18 # 0
3.14159265 28.03.2013 14:12 # +1
PS Зачем index >> 8 джва раза считать?
> mult[index >> 8] *
От этого умножения можно отказаться заменив индексы массива на сдвиги и хитрожопой маской поставив знак минус.
TarasB 28.03.2013 14:31 # 0
3.14159265 28.03.2013 14:58 # +3
Я вам покушать принёс:
Примерно таким нехитрым образом можно вовсе отказаться от ветвлений и таблиц.
А то накал битоёбства недостаточно силён.
http://ideone.com/crluEj
bormand 28.03.2013 15:06 # 0
Надо сложения поменять на ксоры. Тогда все будет хорошо.
P.S. По скорости получилось вдвое медленней http://govnokod.ru/12806#comment173275, по корректности - результаты совпадают.
3.14159265 28.03.2013 15:14 # 0
Не понял. У кого?
Это я не ради скорости, а скорее для лулзов и из любви к битоёбству.
bormand 28.03.2013 15:23 # 0
> Это я не ради скорости, а скорее для лулзов и из любви к битоёбству.
Да понятно, можно и base так переписать, чтобы убрать массив.
3.14159265 28.03.2013 15:27 # 0
>Вдвое медленней моего.
Видать три-четыре такта из L1 и четыре на умножение быстрее чем полтора десятка элементарных операций.
Это в былые времена умножение было мееедленым.
bormand 28.03.2013 14:51 # 0
> Зачем index >> 8 джва раза считать?
Ну если компилятор с этим не справится, то и остальной код будет таким говном, что проще переписать эту функцию полностью на асме.
TarasB 28.03.2013 16:11 # 0
3.14159265 28.03.2013 16:30 # 0
можно чуть-чуть... думаю там где-нить десяток процентов можно выжать. 2 раза - потолок.
Просто размышлять над этим лень.
bormand 28.03.2013 14:54 # 0
const int base[5] = {0x000000, 0x0000FF, 0xFF00FF, 0xFF0000, 0xFFFF00};
const int shifts[5] = {0, 16, 0, 8, 0};
...
return base[index >> 8] ^ ((index & 0xFF) << shifts[index >> 8];
3.14159265 28.03.2013 15:09 # 0
Мой вариант выше.
Знак допиливается так:
(~m & mi) | ((a==4)<<31)
just_nameless 28.03.2013 16:33 # 0
3.14159265 28.03.2013 19:24 # +6
Издательство: Говнокод.ру, 2013 г.
Язык: Русский
Год издания: 2013
Под редакцией Борманда.
Книга предназначена в первую очередь для обучения детей байтоебству на каникулах. Автором рассматривается реализация нетривиальных задач на примитивных битовых командах, а также вопросы тонкой оптимизации кода.
Издание может заинтересовать широкий круг читателей с различным уровнем подготовки.
Для детей дошкольного и младшего школьного возраста. Автор: Тарас Б.
scriptin 28.03.2013 20:52 # 0
3.14159265 28.03.2013 21:49 # +3
Вы можете приобрести премиум-аккаунт.
LispGovno 28.03.2013 22:12 # +1
TarasB 29.03.2013 09:37 # +1
result := c1 and $F0F0F0 + ((c2 and $F0F0F0 - c1 and $F0F0F0) * stage) shr 4.
stage - целое число от 0 до 16
правда стадий всего 16 и цвет выходит 12-битный, но всё равно очень оптимально получается
http://www.gamedev.ru/code/forum/?id=147090
bormand 29.03.2013 09:43 # 0
Ну а так да, для многих применений достаточно подобных упрощеных формул.
TarasB 29.03.2013 09:46 # 0
Steex 28.03.2013 10:00 # 0
bormand 28.03.2013 10:08 # 0
guest 26.03.2013 18:19 # −1
А если тут перегрузка неравенства и что-то делается с magn? Или такого не бывает?
defecate-plusplus 26.03.2013 18:24 # +1
операции встроенных типов нельзя перегрузить
guest 26.03.2013 18:26 # 0
Steex 27.03.2013 22:18 # 0
LispGovno 28.03.2013 22:15 # 0
- Пошли ко мне домой.
- Сейчас, только шапочек прикуплю.