gpt4 book ai didi

c - 了解定点小数部分

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:24 25 4
gpt4 key购买 nike

因此,我正在努力思考定点数。到目前为止,一切都很好。唯一让我感到困惑的是数字的“小数”部分。

我对定点数的理解是它根据小数位数(在本例中等于八位)拆分二进制数。左边是整数部分,分数在右边。XXX.Y 其中XXX是整数/整数部分的三个字节,Y是小数部分的一个字节(请纠正我如果我错了)。

让我们采用以下宏:

#define FIX_SCALE 8
#define FIX_FRACTION_MASK ((1 << FIX_SCALE) - 1)
#define FIX_WHOLE_MASK ~FIX_FRACTION_MASK
#define FIX_FROM_FLOAT(X) ((X) * (1 << FIX_SCALE))
#define FIX_TO_FLOAT(X) ((float)(X) / (1 << FIX_SCALE))
#define FIX_TO_INT(X) ((X) >> FIX_SCALE)
#define FIX_FROM_INT(X) ((X) << FIX_SCALE)
#define FIX_FRACTION(X) ((X) & FIX_FRACTION_MASK)
#define FIX_WHOLE(X) ((X) & FIX_WHOLE_MASK)

考虑以下示例:

int Fixed = FIX_FROM_FLOAT(2.5f);

生成的整数值为 6400x280 为十六进制,0000 0000 0000 0000 0000 0010 1000 0000 为二进制。

让我们取前两个字节:0000 0010 1000 0000

我知道 0000 0010 的来源,它是整数部分 (2)。但我没有得到的是小数部分 1000 0000。我只是不明白这与数字 5(二进制为 0101)有何关系。我本来期望像 0101 00000000 0101 这样的东西——显然我误解了这里的一个基本概念。

如果我写:

int Fraction = FIX_FRACTION(Fixed);

我会得到 128(十六进制的 0x80。这是有道理的,因为它屏蔽了 2 的整数部分)。我第一次写我希望得到 5 的返回。

如果我这样写,我会得到 0.5:

float Fraction = FIX_TO_FLOAT(FIX_FRACTION(Fixed));

有人可以帮我解决这个困惑吗?为什么小数 0000 1000 中没有任何 101?为什么我们必须在 FIX_FRACTION 上执行 FIX_TO_FLOAT 以获得正确的分数?

谢谢。

最佳答案

整数代表10的不同次方:

Integer columns decimal representation ( source )

所以 10203 = 1×10000 + 0×1000 + 2×100 + 0×10 + 3×1

小数继续这种模式,代表 10 的负次方:

Fractional columns decimal representation

所以 0.10203 = 1/10 + 0/100 + 2/1000 + 0/10000 + 3/100000

小数 2.5 在 2s 列有一个“2”,在 1/10ths 列有一个“5”,所以总数是 2×1 + 5/10。

二进制定点的工作方式完全相同,除了 2 的幂而不是 10。整数部分是 1s 列、2s 列、4s 列、8s 列等,小数部分是 1/2s 列、1/4ths 列、1/8ths 列等

例如,如果数字是4.4格式,其中第一个半字节是无符号整数部分,第二个半字节是小数部分,对于二进制数1010 1001,整​​数部分表示

1×8 + 0×4 + 1×2 + 0×1

小数部分代表

1/2 + 0/4 + 0/8 + 1/16

所以十进制等价物是

1×8 + 0×4 + 1×2 + 0×1 + 1/2 + 0/4 + 0/8 + 1/16

= 10.5625

签名版本类似:

signed binary 4.4 representation ( source )

所以在你的二进制格式中,2.5 是 0b0000 0010 1000 0000,第一个字节在 2s 列中有 1,在 1s 列中有 0,所以它是

... + 0×4 + 1×2 + 0×1 + 1/2 + 0/4 + 0/8 + ...

关于c - 了解定点小数部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com