16-битное сложение 2n масштабированного целого
Когда я собираюсь реализовать 16-битное сложение 2n Scaled Integer из спецификации автосар. Я не получил значения a, b и c в них.
Я собираюсь реализовать 16-битное добавление 2n Scaled Integer из спецификации autosar для модулей mfx. в котором я получаю в 8.6.4.1 16-битное сложение 2n Scaled Integer, в котором они задают положение точки Radix первого операнда с фиксированной точкой. Должно быть постоянным выражением. b Положение радикса второго операнда с фиксированной точкой. Должно быть постоянным выражением. c Позиция радикальной точки результата с фиксированной точкой. Должно быть постоянным выражением.
Допустимый диапазон: 0 ≤ | a - b | ≤ 15
(c - b) ≤ 15, (a - c) ≤ 15, a ≥ b
(c - a) ≤ 15, (b - c) ≤ 15, a
Но я не понимаю, как я получу значение диапазона для c.
для ниже условия
#include "stdio.h"
void main()
{
if(a > =b)
C = 2^(c-a) * [x + (y * 2^(a-b))]
else
C = 2^(c-b) * [(x * 2^(b-a)) + y].
}
Какими будут ответы, если x =10, y=10 и a=20, b=10 и c= 100;
1 ответ
Кажется, у вас есть проблема с преобразованием математического уравнения в исходный код языка Си. Обратите внимание, что в математике 2^n означает повышение 2 до степени n. Таким образом, m*2^n означает m*2^abs(n), если n >=0, и означает m/(2^abs(n)), если n < 0.
Таким образом, читая спецификацию, стр. 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 и a = 20, b = 10 и c= 100; Проверьте:
- 0<=abs(ab)<=15 - да
- А> = б - да
- Есть (cb)<= 15 - НЕТ
Итак, с точки зрения SWS_Mfx_00154, результат должен быть
- UINT16_MAX (65535) для Mfx_AddP2_u16u16_u16, Mfx_AddP2_u16s16_u16 и Mfx_AddP2_s16s16_u16
, а также
- INT16_MAX (32767) для Mfx_AddP2_u16u16_s16, Mfx_AddP2_u16s16_s16 и Mfx_AddP2_s16s16_s16