Выполняется ли галоидная математика в формате с плавающей запятой (32 бита)?

Я пишу код Halide и объявил вход Buffer‹ double> в качестве входных данных для своей функции Halide. Однако я не уверен, имеет ли это какой-либо смысл, поскольку в учебнике Halide # 1 говорится

// Halide does type inference for you. Var objects represent
// 32-bit integers, so the Expr object 'x + y' also represents a
// 32-bit integer, and so 'gradient' defines a 32-bit image, and
// so we got a 32-bit signed integer image out when we call
// 'realize'. Halide types and type-casting rules are equivalent
// to C.

Я могу запустить функцию без каких-либо проблем, но я не уверен, что выполняется какое-то приведение типов для преобразования моего двойного числа в число с плавающей запятой без моего ведома.


person Sergio Matiz    schedule 22.11.2019    source источник


Ответы (1)


Хороший вопрос! (Нам нужно больше и лучше документации.)

Совершенно разумно использовать doubles. Как и в C (с этими правилами продвижения типов в стиле C, упомянутыми в цитируемом вами комментарии), double <op> float или double <op> int будут выполнять вычисления и возвращать результаты как double.

Если, например, у вас есть свой Buffer<double> input, то:

Func f; Var x, y;
f(x,y) = input(x,y)*2;

также с типом вывода f как double. Вы заметите это, если проверите тип буфера, который вы получите в результате. Как и в C, константа int 2 перед умножением будет преобразована в double, а результат будет сохранен как double. Тип каждого Func просто задается предполагаемым типом правой части Expr, которая сначала определяет его.

Типы повышаются автоматически, а не понижаются. Если вы хотите ограничить тип результата, вы можете использовать явные cast в своих выражениях.

Имеет ли это смысл?

person jrk    schedule 23.11.2019