LJ *_*eng 0 c precision multiplication floating-accuracy
我需要执行400*256.3的简单乘法.结果是102520.直线前进,简单.但是在C++(或C)中实现这种乘法对我来说有点棘手和困惑.
我知道浮点数不代表它在计算机中.我写了代码来说明情况.输出也附加了.
所以,如果我使用float类型变量进行乘法运算,我会遇到舍入误差.使用double类型变量可以避免这个问题.但是,假设我在嵌入式系统上的资源非常有限,我必须尽可能地优化变量类型,如何使用float类型变量执行乘法并且不容易出现舍入误差?
我知道计算机完成的浮点运算并没有被打破.但我很好奇进行浮点数学的最佳实践.256.3只是一个插图的值.我不知道在运行时我会得到什么浮点值.但它肯定是一个浮点值.
int main()
{
//perform 400 * 256.3
//result should be 102520
float floatResult = 0.00f;
int intResult = 0;
double doubleResult = 0.00;
//float = int * float
floatResult = 400 * 256.3f;
printf("400 * 256.3f = (float)->%f\n", floatResult);
//float = float * float
floatResult = 400.00f * 256.3f;
printf("400.00f * 256.3f = (float)->%f\n", floatResult);
printf("\n");
//int = int * float
intResult = 400 * 256.3f;
printf("400 * 256.3f = (int)->%d\n", intResult);
//int = float * float;
intResult = 400.00f * 256.3f;
printf("400.00f * 256.3f = (int)->%d\n", intResult);
printf("\n");
//double = double * double
doubleResult = 400.00 * 256.3;
printf("400.00 * 256.3 = (double)->%f\n", doubleResult);
//int = double * double;
intResult = 400.00 * 256.3;
printf("400.00 * 256.3 = (int)->%d\n", intResult);
printf("\n");
//double = int * double
doubleResult = 400 * 256.3;
printf("400 * 256.3 = (double)->%f\n", doubleResult);
//int = int * double
intResult = 400 * 256.3;
printf("400 * 256.3 = (int)->%d\n", intResult);
printf("\n");
//will double give me rounding error?
if (((400.00 * 256.3) - 102520) != 0) {
printf("Double give me rounding error!\n");
}
//will float give me rounding error?
if (((400.00f * 256.3f) - 102520) != 0) {
printf("Float give me rounding error!\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您有一个固定的十进制数字(如果是1 256.3)以及结果的有界范围,您可以使用整数乘法,并通过整数除法调整十进制数字的移位:
int result = (400 * 2563) / 10;
Run Code Online (Sandbox Code Playgroud)
舍入误差是浮点算术所固有的,除了少数几个可以精确表示所有操作数的情况.无论你选择float或double只是影响时发生错误,没有如果.
首先,了解 typedouble与 type 具有所有相同的问题float。这两种类型都没有无限的精度,因此这两种类型都容易受到精度损失和其他问题的影响。
至于你能做什么:根据你正在做的事情,会出现许多不同的问题,并且有许多技术可以克服这些问题。关于这些技术已经有很多很多的文字;我建议在网上搜索“避免浮点错误”。但基本点是:
另请参阅https://www.eskimo.com/~scs/cclass/handouts/sciprog.html。
| 归档时间: |
|
| 查看次数: |
5190 次 |
| 最近记录: |