16-битное добавление 2n Scaled Integer

Когда я собираюсь реализовать 16-битное добавление 2n Scaled Integer из спецификации autosar. Я не понял, что такое значения a, b и c в них.

Я собираюсь реализовать 16-битное добавление 2n Scaled Integer из спецификации autosar для модулей mfx. в котором я получаю в 8.6.4.1 16-битное сложение 2n масштабированного целого числа, в котором они указывают позицию точки счисления первого операнда с фиксированной точкой. Должно быть постоянное выражение. b Позиция точки счисления второго операнда с фиксированной точкой. Должно быть постоянное выражение. c Положение точки счисления результата с фиксированной точкой. Должно быть постоянное выражение.

Допустимый диапазон: 0 ≤ |a - b| ≤ 15
(в - б) ≤ 15, (а - в) ≤ 15, а ≥ b
(в - а) ≤ 15, (б - в) ≤ 15, а ‹ б

Но я не понимаю, как я получу значение диапазона для 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;


person Tejas    schedule 05.02.2019    source источник


Ответы (1)


Кажется, у вас возникла проблема с преобразованием математического уравнения в исходный код C. Обратите внимание, что в математике 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; Проверять:

  1. 0‹=abs(a-b)‹=15 - да
  2. а>=б - да
  3. Is (c-b)<=15 - NO

Таким образом, с точки зрения SWS_Mfx_00154 результат должен быть

  1. UINT16_MAX (65535) для Mfx_AddP2_u16u16_u16, Mfx_AddP2_u16s16_u16 и Mfx_AddP2_s16s16_u16

, и

  1. INT16_MAX (32767) для Mfx_AddP2_u16u16_s16, Mfx_AddP2_u16s16_s16 и Mfx_AddP2_s16s16_s16
person Gunther Schulz    schedule 05.02.2019
comment
Спасибо @ Гюнтер Шульц. ваш ответ мне очень помогает, но для преобразования 32-битного в 16-битное 2-кратное целочисленное преобразование - person Tejas; 05.02.2019
comment
@VikrantDaharwal, я не понимаю твой комментарий, не мог бы ты его перефразировать? - person Gunther Schulz; 05.02.2019
comment
Спасибо @ Гюнтер Шульц. ur ans мне очень помогает, но для 32-16-битного преобразования 2n я пишу код, как это? flaot32 v_Return_val ; sint16 v_ScaleFactor; Коэффициент масштабирования = с - а; if(SCALE_MAX7 ‹ ScaleFactor) { ScaleFactor = SCALE_MAX7; } else if(SCALE_MIN15 › ScaleFactor) { ScaleFactor = ME_SCALE_MIN15; } v_Return_val = truncf(powf(2.0f,(float32)ScaleFactor) * (float32)x); if(MAX_VAL‹ v_Return_val_f32) { v_Return_val = MAX_VAL; } возврат (uint8)v_Return_val ; } - person Tejas; 05.02.2019
comment
@VikrantDaharwal, во-первых, вы имеете дело с масштабированными целыми числами, а не с плавающей запятой - не используйте их, они приведут к ошибкам округления. Во-вторых, точный алгоритм приведен в таблице данных и соответствующим образом закодирован в моем ответе. В-третьих, мой вопрос связан с вашей фразой преобразования 32-бит в 16-бит 2n Scaled Integer. - person Gunther Schulz; 05.02.2019
comment
Я понимаю @ Gunther Schulz и полностью доволен вашим ответом. Большое спасибо:) - person Tejas; 05.02.2019
comment
@VikrantDaharwal, это удовольствие. Пожалуйста, заплатите вперед, проголосуйте и примите ответ. - person Gunther Schulz; 05.02.2019