2016-07-01 1 views
1

Я использую следующий код, чтобы передать массив чисел с плавающей точкой в ​​Renderscript ядра:Как использовать половину точности в renderscript?

float[] bufName = new float[3]; 
bufName [0] = 255; 
bufName [1] = 255; 
bufName [2] = 0; 

Allocation alloc1 = Allocation.createSized(mRs, Element.F32(mRs), 3); 
alloc1.copy1DRangeFrom(0, 3, mtmd); 
ScriptC_foo foo = new ScriptC_foo(mRs); 
foo.set_gIn(alloc1); 

И я определил gIn в файле foo.rs следующим образом:

rs_allocation gIn; 

Я хотел бы работать с 16-битными числами с плавающей запятой. Я знаю, что я должен изменить создание выделения на это:

Allocation alloc1 = Allocation.createSized(mRs, Element.F16(mRs), 3); 

Однако, я не могу найти решение для копирования массива имени-буфера к распределению. Любая помощь приветствуется.

ответ

1

Java не определяет полуточность поплавков, поэтому вам придется делать свои собственные манипуляции, чтобы заставить это работать. Если вы используете Float.valueOf(f).shortValue() (где f - это конкретный поток, который вы хотели бы представить как полуточность). Это должно должным образом отбросить float на новый размер бита. Затем создайте Allocation размера Element.F16. Вы должны иметь возможность скопировать массив значений short до RenderScript для выполнения этой работы.

+0

Спасибо за ваш ответ. 'Float.valueOf (f) .shortValue()' преобразует числа в целые (короткие) числа. Я хочу сохранить дробную часть. – MTMD

+0

Это был, по общему признанию, длинный выстрел. Вы можете использовать один из методов Float для преобразования в биты int, а затем масштабировать до коротких бит. –

+0

Возможно, вы сможете копировать полупоплавки в выделение, используя собственный RenderScript api. –

Смежные вопросы