我正在尝试提出一种使用软件解决硬件限制的方法。我遇到的问题是,我只能写入整数(整数),但是我希望在计算结果时使用十进制数的奢侈品。
带有转换因子的十六进制量在这里浮现..我可以在技术上发送类似(00) 1105 的十六进制值,然后将其解释为11.05(e^-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.%03dn", FP_INT_PART(a), FP_DEC_PART(a));
printf("b = %d.%03dn", FP_INT_PART(b), FP_DEC_PART(b));
int a_plus_b = FP_ADD(a, b);
printf("a + b = %d.%03dn", FP_INT_PART(a_plus_b), FP_DEC_PART(a_plus_b));
int a_minus_b = FP_SUB(a, b);
printf("a - b = %d.%03dn", FP_INT_PART(a_minus_b), FP_DEC_PART(a_minus_b));
int b_minus_a = FP_SUB(b, a);
printf("b - a = %d.%03dn", FP_INT_PART(b_minus_a), FP_DEC_PART(b_minus_a));
int a_multiply_b = FP_MUL(a, b);
printf("a * b = %d.%03dn", FP_INT_PART(a_multiply_b), FP_DEC_PART(a_multiply_b));
int a_divide_b = FP_DIV(a, b);
printf("a / b = %d.%03dn", FP_INT_PART(a_divide_b), FP_DEC_PART(a_divide_b));
int b_divide_a = FP_DIV(b, a);
printf("b / a = %d.%03dn", FP_INT_PART(b_divide_a), FP_DEC_PART(b_divide_a));
return 0;
}
您根本不清楚,如果您只需要在没有fpu的情况下进行浮点计算,只需使用floating-Point库来进行整数处理器
我记得我在考试中做了类似的事情。我认为这取决于应用程序。
用于数值处理,您可以做这样的事情:
- 通过减去平均值并除以模块的最大值来缩放[-1; 1]范围内的所有数字。这样,乘法将属于同一范围
- 将所有数字乘以2的功率,具体取决于您的体系结构(例如
2^32
或2^64
) - 将值圆向整数
- 做您的操作
- 通过除以2 的功率来重新列出值
- 将数字带回原始范围
我会尽快为您提供更多详细信息。