16位加入2N的刻度整

问题描述 投票:0回答:1

当我要实现16位加法2N从AUTOSAR规范刻度整的。我没有得到的是在这些A,B和C值。

我要实现16位加法2N从AUTOSAR规范刻度整的MFX模块。我在其中得到刻度整2N的8.6.4.1 16位加法中,他们指定第一个定点运算的小数点位置。必须是一个常量表达式。第二固定点的操作数说明B小数点位置。必须是一个常量表达式。固定点结果Ç小数点位置。必须是一个常量表达式。

有效范围:0≤|一个 - B | ≤15 (C - B)≤15中,(a - c)中≤15,≥b (C - A)≤15,(B - C)≤15,A <B

但我不明白,我将如何获得℃范围内的值。

下面条件

 #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].
  }

会是怎样的ANS如果x = 10,Y = 10,且a = 20,B = 10和c = 100;

c math autosar
1个回答
2
投票

看来你有问题的数学公式转换为C源代码。请注意,在数学,2 ^ n表示提高2的n次幂。因此米* 2 ^ n表示米* 2 ^ ABS(n)的如果n> = 0的装置,以及M /(2 ^ ABS(n))的如果n <0。

因此,读spec, page 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,B = 10,C = 100;校验:

  1. 是0 <= ABS(A-B)<= 15 - 是
  2. 是一个> = B - 是的
  3. 为(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
© www.soinside.com 2019 - 2024. All rights reserved.