Кажется, у вас проблема с преобразованием математического уравнения в исходный код языка Си.Обратите внимание, что в математике 2 ^ n означает повышение 2 до степени n.Таким образом, m * 2 ^ n означает m * 2 ^ abs (n), если n> = 0, и означает m / (2 ^ abs (n)), если n <0. </p>
Таким образом, читая spec, стр. 53-54 , у нас есть, например:
#include <stdint.h>
uint16_t Mfx_AddP2_u16u16_u16(uint16_t x, uint16_t y, int16_t a, int16_t b, int16_t c)
{
if(a>=b)
{
if(((a-b)>15) || ((c-b)>15) || ((a-c)>15))
{
//SWS_Mfx_00154 - saturate to boundary value
return UINT16_MAX;
}
else
{
uint32_t baseValue = (UINT32_C(1) << (a-b)) * y + x;
if(c>=a)
{
return (uint16_t)(baseValue << (c-a));
}
else
{
//SWS_Mfx_00155 - round to zero
return (uint16_t)(baseValue >> (a-c));
}
}
}
else
{
if(((b-a)>15) || ((c-a)>15) || ((b-c)>15))
{
//SWS_Mfx_00154 - saturate to boundary value
return UINT16_MAX;
}
else
{
uint32_t baseValue = (UINT32_C(1) << (b-a)) * x + y;
if(c>=b)
{
return (uint16_t)(baseValue << (c-b));
}
else
{
//SWS_Mfx_00155 - round to zero
return (uint16_t)(baseValue >> (b-c));
}
}
}
}
Я надеюсь, что вы можете аналогичным образом выполнить функции, объявленные ниже:
uint16_t Mfx_AddP2_u16s16_u16(uint16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
uint16_t Mfx_AddP2_s16s16_u16( int16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
int16_t Mfx_AddP2_u16u16_s16(uint16_t x, uint16_t y, int16_t a, int16_t b, int16_t c);
int16_t Mfx_AddP2_u16s16_s16(uint16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
int16_t Mfx_AddP2_s16s16_s16( int16_t x, int16_t y, int16_t a, int16_t b, int16_t c);
Примечание: будьте осторожны спараметры со знаком и возвращаемые значения.
Редактировать: Отвечая на актуальный вопрос
Если вы спросите, каков будет результат, когда x = 10, y = 10, иа = 20, б = 10 и с = 100;Проверьте:
- 0 =
- Is> = b - да
- Is (cb) <= 15- НЕТ </li>
Итак, с точки зрения SWS_Mfx_00154, результат должен быть
- UINT16_MAX (65535) для Mfx_AddP2_u16u16_u16, Mfx_AddP2_u16s16_u16 и M6 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10_30и
- INT16_MAX (32767) для Mfx_AddP2_u16u16_s16, Mfx_AddP2_u16s16_s16 и Mfx_AddP2_s16s16_s16