【问题标题】:How to manually convert between fixed type and floating type?如何在固定类型和浮动类型之间手动转换?
【发布时间】:2023-04-01 07:28:01
【问题描述】:

我正在使用具有定点变量的库。该库名为libfixmath

我正在尝试查看数字如何从 fix16_t 转换为 float 类型。我知道它使用 32 位(整数 16 MSB 位和小数 16 LSB 位)来表示一个数字。

这是我试过的代码,这里的“sum”是 fix16_t 类型。

float in_sum = fix16_to_float(sum);
printf("fix16 type sum:%u\n",sum);
printf("float type sum:%f\n",in_sum);

我以无符号整数格式显示“总和”,但我不确定显示“总和”值的最佳格式。

我得到的示例输出是:

fix16 type sum:4064807395
float type sum:-3511.961426

我看了一下转换函数:

static inline float   fix16_to_float(fix16_t a) { return (float)a / fix16_one; }

fix16_one 是 65536。

为了更好地理解,我希望能够手动转换它,但我不知道如何。我对类型转换 (float)a 感到困惑。

我的另一个问题是,这 16 个整数位是有符号还是无符号?

【问题讨论】:

  • fix16_t实际类型是什么?
  • @Someprogrammerdude 在库中它是这样定义的“typedef int32_t fix16_t”

标签: c casting floating-point fixed-point


【解决方案1】:

如果fix16_t 是整数类型,那么a / 65536 将是一个整数 除法,没有任何小数。比如65535 / 65536不是浮点值0.99998,而是整数值0

a 的强制转换将a 转换为整个表达式,从而转换为带小数的浮点除法。


使用值:

  1. 整数除法:-230159901 / 65536 将得到 整数-3511
  2. 浮点除法:(float)-230159901 / 65536 将产生float-3511.961426

【讨论】:

  • 当我使用计算器计算 4064807395 / 65536 时,我得到 62024。这不是程序计算的结果(即 -3511)。我可以使用什么计算来获得与示例相同的结果?
  • @ghostwar88 问题是您的printf 调用中的未定义行为 之一。 "%u" 格式适用于 unsigned int,而 int32_t 类型是 signed(和因此应该使用"%d",或者更好的是printf("fix16 type sum:"PRId32"\n", sum);)实际值不是你想象的那样。
  • 谢谢,我去试试
  • @ghostwar88 啊,我忘了%printf("fix16 type sum:%"PRId32"\n", sum); 它应该给出相同的结果(-230159901)。
  • Re “带小数”:除以二进制浮点数可能会产生小数(非整数)值,而不是小数。考虑二进制浮点数据,因为十进制会导致对行为的错误和/或不准确推理。
猜你喜欢
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
相关资源
最近更新 更多