как преобразовать float в int с сохранением битового значения

У меня есть число с плавающей запятой4, поступающее в вычислительный шейдер, 3 из этих чисел с плавающей запятой действительно являются числами с плавающей запятой, но четвертое представляет собой 2 числа uint, сдвинутые вместе. Как мне преобразовать число с плавающей запятой в uint, сохранив последовательность битов вместо числового значения?

на стороне С++ я решил это, создав указатель uint, заполнив его нужным числом и вместо этого передав указатель как указатель с плавающей запятой. Однако в hlsl, как и в c/c++, нет указателей, поэтому я застрял здесь: |


person Jake Freelander    schedule 14.06.2012    source источник
comment
привет @karli-raudsepp, ты должен вернуться и принять некоторые ответы на свои вопросы. Люди усердно работали, отвечая на ваши вопросы, так что самое меньшее, что вы можете сделать, это показать будущим читателям, какие ответы наиболее полезны.   -  person Hans Z    schedule 14.06.2012
comment
Я не особо разбираюсь в C++, но не могли бы вы преобразовать число с плавающей запятой в структуру из двух short?   -  person tskuzzy    schedule 14.06.2012


Ответы (2)


В HLSL вы сможете сделать следующее (при условии, что значение, которое вы ищете, находится в f4.w)

uint ui = asuint( f4.w );
uint ui1 = ui & 0xffff;
uint ui2 = ui >> 16;

В основном это выглядит как встроенный asuint твой друг :)

person Goz    schedule 14.06.2012
comment
если ответ поможет вам, вам следует подумать о том, чтобы принять его - person phuclv; 23.07.2014
comment
@LưuVĩnhPhúc: я сомневаюсь, что он это заметит ... Я тот, кто получает уведомления о комментариях к моему ответу;) - person Goz; 23.07.2014
comment
@Goz на самом деле и спрашивающий, и отвечающий будут уведомлены о комментарии к его вопросу / ответу, и, конечно же, человек, который был отмечен, тоже :) - person phuclv; 23.07.2014
comment
Действительно? Я не получаю уведомления, когда люди комментируют ответы на мои вопросы... - person Goz; 23.07.2014

Можно использовать союз.

float f;  // you float value is here

union X  
{  
    float f;  
    short int a[2];  
} x;  
x.f = f;

int i1 = x.a[0];  // these are your ints  
int i2 = x.a[1];
person Anon Mail    schedule 14.06.2012
comment
Хм, число с плавающей запятой всего 32 бита. Я думаю, вы хотите «короткий» вместо «int». - person ; 14.06.2012