在C ++的大代码中,有许多计算和转换(到不同的数据类型)最终得到一个浮点数,这个数字在这些大的计算和铸件中被截断或舍入。
例如,我没有得到正确的精确数字0.2500992,而是得到了圆形数字0.2501。
由于
答案 0 :(得分:0)
我发现在减去两个浮点数时发生了一个小错误,我使用另一种方法ceil()和1浮点操作而不是三个浮点操作(第一种方法)进行计算。 p>
它给出了不同的结果,但两个结果是常数0.2500992或0.2501。
在我看来,解决方案是使用ceil的方法,因为它具有较少的浮点操作小错误。
这是我的代码,可以清楚地解释我面临的问题。
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define PARTS_PER_MILLION 1000000
#define FLOATING_POINT_ERROR 0.00001
int main()
{
float ppm_f free_hd_ports;
float totalAllocatedVideoParties = 1.749899983406066894531250000000;
float num_hd720_vid_ports= 1.749899983406066894531250000000;
unsigned short min_video_parties = 30,numVidHD720Parties = 28,numVidCifParties = 84,numVidHDParties;
char buffer[25];
unsigned long ppm1,ppm2;
//method 1
numVidHD720Parties = floor(min_video_parties - totalAllocatedVideoParties);
free_hd_ports = (float)min_video_parties - totalAllocatedVideoParties;
ppm_f = (free_hd_ports - numVidHD720Parties);
printf("ppm_f calculated by method with floating point subsctraction: %.20f\n",ppm_f);
//method 2
numVidHDParties = (unsigned short)ceil(num_hd720_vid_ports);
ppm_f = ((float)numVidHDParties) - num_hd720_vid_ports;
printf("ppm_f calculated by ceil method: %.20f\n",ppm_f);
}
屏幕:
ppm_f calculated by method with floating point subsctraction: 0.25009918212890625000
ppm_f calculated by ceil method: 0.25010001659393310547
此示例显示了前面提到的以下链接中描述的浮点计算错误: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html