C 用整数表示十进制数

C 用整数表示十进制数,c,math,C,Math,我正试图想出一种方法,用软件解决我的硬件限制。我的问题是,我只能在硬件中写入整数,但我想在计算结果时使用十进制数字 这里想到了带转换因子的十六进制。。我可以从技术上发送一个十六进制值,比如(00)1105,然后将其解释为11.05(E^-2)软件端 这意味着我在技术上可以在软件端处理十进制数,而只向硬件发送整数 有没有更好的方法来处理这个问题?(二进制值不是一个选项,因为可以发送的消息有长度限制。(长度您一点也不清楚,如果您只需要在没有FPU的情况下进行浮点计算,只需使用LIB,就像我从问题中了

我正试图想出一种方法,用软件解决我的硬件限制。我的问题是,我只能在硬件中写入整数,但我想在计算结果时使用十进制数字

这里想到了带转换因子的十六进制。。我可以从技术上发送一个十六进制值,比如(00)1105,然后将其解释为11.05(E^-2)软件端

这意味着我在技术上可以在软件端处理十进制数,而只向硬件发送整数


有没有更好的方法来处理这个问题?(二进制值不是一个选项,因为可以发送的消息有长度限制。(长度您一点也不清楚,如果您只需要在没有FPU的情况下进行浮点计算,只需使用LIB,就像我从问题中了解的那样,定点可能会对您有所帮助。 固定点允许您使用整数执行十进制算术,前提是小数点后的位数事先已知

下面是一个快速而肮脏的定点实现:

#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;
}
#包括
#定义FP_ABS(x)((x)>=0?(x):-(x))
//这将确定小数点后的位数。
//它必须是10的幂。
//在这种情况下,您可以表示-2147483.648到2147483.647范围内的所有数字
//或者如果你想安全-2000000.000到2000000.000
#定义FP_十进制系数1000
#定义FP_LIT(x)((int)((x)*FP_十进制因子))
#定义FP_加(x,y)((x)+(y))
#定义FP_SUB(x,y)((x)-(y))
#定义FP_MUL(x,y)((x)*(y)/FP_十进制因子)
#定义FP_DIV(x,y)((x)*FP_十进制系数/(y))
#定义FP_整数部分(x)((x)/FP_小数点系数)
#定义FP_DEC_部分(x)(FP_ABS((x)%FP_十进制系数))
int main()
{
int a=FP_点亮(25.01);
int b=FP_点亮(12.2);
printf(“a=%d.%03d\n”,FP_INT_部分(a),FP_DEC_部分(a));
printf(“b=%d.%03d\n”,FP_INT_部分(b),FP_DEC_部分(b));
int a_加上b=FP_加(a,b);
printf(“a+b=%d.%03d\n”、FP_INT_部分(a_plus_b)、FP_DEC_部分(a_plus_b));
int a_减b=FP_SUB(a,b);
printf(“a-b=%d.%03d\n”、FP_INT_部分(a_减b)、FP_DEC_部分(a_减b));
int b_减a=FP_SUB(b,a);
printf(“b-a=%d.%03d\n”、FP_INT_部分(b_减去a)、FP_DEC_部分(b_减去a));
int a_multiply_b=FP_MUL(a,b);
printf(“a*b=%d.%03d\n”、FP_INT_部分(a_multiply_b)、FP_DEC_部分(a_multiply_b));
int a_divide_b=FP_DIV(a,b);
printf(“a/b=%d.%03d\n”、FP_INT_部分(a_divide_b)、FP_DEC_部分(a_divide_b));
int b_divide_a=FP_DIV(b,a);
printf(“b/a=%d.%03d\n”、FP_INT_部分(b_divide_a)、FP_DEC_部分(b_divide_a));
返回0;
}

我记得我在一次考试中做了类似的事情。我想这取决于申请

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

  • 通过减去平均值并除以模的最大值,对[-1;1]范围内的所有数字进行缩放。这样,乘法将属于相同的范围
  • 根据您的体系结构,将所有数字乘以2的幂(例如
    2^32
    2^64
  • 将值舍入为整数
  • 做你的手术
  • 通过除以2的幂重新缩放值
  • 将数字恢复到原始范围

我将尽快向您提供更多详细信息。

如果没有必要,我将避免使用浮点实现。硬件可以处理的整数范围是多少?需要表示的十进制数范围是多少?硬件可能是一个“黑匣子”但是,据推测,您希望向它发送值,以便执行某些操作并生成结果。这些信息对于决定哪种方法是“最佳”方法至关重要,但您没有提供此类信息。为什么您认为将十六进制值解释为十进制值是一种好方法?十六进制只是一种字符串表示形式,因此这种向十进制的隐式转换似乎非常随意。为什么不使用十进制值并在某个地方设置一个固定点(即100是1.00)消息中到底可以发送什么?(最多)任何值的10字节?一个字符串(最多)10位十六进制数字?还有什么?..@Joel您的问题不清楚,您没有回答所有的评论…好建议。请注意
FP_MUL
FP_DIV
应使用
long
算术,以减少算术溢出产生错误结果的可能性。