是否有任何方法可以实现数字是否因转换而被截断?

时间:2014-01-17 00:47:51

标签: c++

在C ++的大代码中,有许多计算和转换(到不同的数据类型)最终得到一个浮点数,这个数字在这些大的计算和铸件中被截断或舍入。

例如,我没有得到正确的精确数字0.2500992,而是得到了圆形数字0.2501。

  1. 如果因转换而截断号码,是否有编译器警告?
  2. 是否有任何已知的软件可以查看代码并告诉我哪些数字可能被截断?
  3. 在哪种情况下会发生浮点数的截断(转换为哪种数据类型时)?
  4. 编译器汇总浮点数吗?我可以告诉编译器不要向上舍入吗?
  5. 由于

1 个答案:

答案 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