带有负数的嵌入式除法

杰夫·兰姆

在我从事嵌入式编程的所有岁月中,我通常从不需要使用负数。这很疯狂,但是在我的工作中他们很少出现。

我目前正在处理传感器读数,该读数可以为正或负,并且需要按0.006进行缩放,并保留符号。为了避免在运行时进行不必要的浮点计算,我有一种算法可以将其转换为分子和分母(3/500)。带有正数的所有内容都按预期工作,但是带负数的情况如下:

Raw data:         -103
Multiplied by 3:  -309
Divided by 500:   36893488147419102

我弄清楚了这个数字的来源,并且有一个解决方法,但我更愿意相信数学是数学。

这是十六进制相同的计算:

Raw data:         0xFFFFFFFFFFFFFF99
Multiplied by 3:  0xFFFFFFFFFFFFFECB
Divided by 500:   0x0083126E978D4FDE

在计算器(SpeedCrunch)中:

0xFFFFFFFFFFFFFECB/500 = 0x83126E978D4FDE.9D2F1A9FBE76C8B44

该原始文件368934881474191020x83126E978D4FDESpeedCrunch结果的组成部分

我不需要保存符号,做一个正数除法,然后每次我用负数进行除法时都重新添加符号。这里发生了什么?

环境是CortexM3 micro,使用c ++ 11的GCC4.9.3。计算是在上进行的int64_t,分子/分母为uint64_t

编辑:这是响应下面迈克尔的评论的代码片段:

int64_t data = -103;
uint64_t resolutionNumerator = 3;
uint64_t resolutionDenominator = 500;

data *= resolutionNumerator;
data /= resolutionDenominator;
克鲁格

具有相同宽度的有符号和无符号整数的运算(例如uint64_tint64_t)导致有符号操作数被转换为无符号操作数的类型。

因此,这两个表达式是等效的:

  • (int64_t) -103 * (uint64_t) 3 / (uint64_t) 500
  • (uint64_t) -103 * (uint64_t) 3 / (uint64_t) 500

如果将符号类型int64_t用于分子和分母,则结果将保留符号。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章