用整数表示十进制数

时间:2019-03-21 13:10:54

标签: c math

我正在尝试提出一种使用软件解决硬件限制的方法。我的问题是我只能将整数(整数)写入我的硬件,但是我希望在计算结果等时可以使用十进制数。

带有转换因子的HexaDecimals出现在这里。.我可以技术上发送十六进制值,例如(00) 1105 ,然后将其解释为软件方面11.05(E ^ -2) 。

  

这意味着我可以在仅将整数发送到硬件的情况下,在软件方面处理十进制数字。

是否有更好的方法来解决此问题? (二进制值不是可选项,因为可以发送的消息有长度限制。(长度<= 10)。我不会超过E ^ 5(nnnnn)预期的用途。)

当前的方法存在明显的问题,所有方法都可能具有,但我很好奇能否通过其他方式实现此目标?

不用担心硬件,只需将其视为黑匣子即可,其中整数是唯一有效的输入。

3 个答案:

答案 0 :(得分:2)

根据我对问题的了解,定点可能会为您提供帮助。 定点允许您使用整数进行十进制算术,前提是预先知道小数点后的位数。

这里是固定点的一种快速而肮脏的实现:

#include <stdio.h>

#define FP_ABS(x) ((x) >= 0 ? (x) : -(x))

// This will determine the number of digits after the decimal point.
// It must be a power of 10.
// In this case, you can represent all the numbers in the range -2147483.648 to 2147483.647
// or if you want to be safe -2000000.000 to 2000000.000
#define FP_DECIMAL_FACTOR 1000

#define FP_LIT(x) ((int)((x) * FP_DECIMAL_FACTOR))
#define FP_ADD(x, y) ((x) + (y))
#define FP_SUB(x, y) ((x) - (y))
#define FP_MUL(x, y) ((x) * (y) / FP_DECIMAL_FACTOR)
#define FP_DIV(x, y) ((x) * FP_DECIMAL_FACTOR / (y))

#define FP_INT_PART(x) ((x) / FP_DECIMAL_FACTOR)
#define FP_DEC_PART(x) (FP_ABS((x) % FP_DECIMAL_FACTOR))


int main()
{
    int a = FP_LIT(25.01);
    int b = FP_LIT(12.2);

    printf("a = %d.%03d\n", FP_INT_PART(a), FP_DEC_PART(a));
    printf("b = %d.%03d\n", FP_INT_PART(b), FP_DEC_PART(b));

    int a_plus_b = FP_ADD(a, b);
    printf("a + b = %d.%03d\n", FP_INT_PART(a_plus_b), FP_DEC_PART(a_plus_b));

    int a_minus_b = FP_SUB(a, b);
    printf("a - b = %d.%03d\n", FP_INT_PART(a_minus_b), FP_DEC_PART(a_minus_b));

    int b_minus_a = FP_SUB(b, a);
    printf("b - a = %d.%03d\n", FP_INT_PART(b_minus_a), FP_DEC_PART(b_minus_a));

    int a_multiply_b = FP_MUL(a, b);
    printf("a * b = %d.%03d\n", FP_INT_PART(a_multiply_b), FP_DEC_PART(a_multiply_b));

    int a_divide_b = FP_DIV(a, b);
    printf("a / b = %d.%03d\n", FP_INT_PART(a_divide_b), FP_DEC_PART(a_divide_b));

    int b_divide_a = FP_DIV(b, a);
    printf("b / a = %d.%03d\n", FP_INT_PART(b_divide_a), FP_DEC_PART(b_divide_a));

    return 0;
}

答案 1 :(得分:1)

您根本不清楚,如果只需要在没有FPU的情况下进行浮点计算,则只需使用Floating-point Library for Integer Processors之类的库即可。

答案 2 :(得分:0)

我记得我在考试中做了类似的事情。我认为这取决于应用程序。

对于数值处理,您可以执行以下操作:

    通过减去平均值并除以模块的最大值,来缩放[-1; 1]范围内的所有数字。这样,乘法将属于同一范围
  • 将所有数字乘以2的幂,具体取决于您的体系结构(例如2^322^64
  • 将值四舍五入为整数
  • 进行操作
  • 通过除以2的幂来重新缩放值
  • 将数字恢复到原始范围

我会尽快为您提供更多详细信息。