有没有办法知道一个数字是否因为转换而被截断? 在C++中的大代码中,有许多计算和铸件(不同的数据类型)以获得一个浮点数,这个数字在这些大的计算和铸件中被截断或舍入。

有没有办法知道一个数字是否因为转换而被截断? 在C++中的大代码中,有许多计算和铸件(不同的数据类型)以获得一个浮点数,这个数字在这些大的计算和铸件中被截断或舍入。,c++,C++,例如,我没有得到正确精确的数字0.2500992,而是取整了数字0.2501 如果数字因转换而被截断,是否存在任何编译器警告 是否有任何已知的软件可以检查代码并告诉我哪些数字可能被截断 在哪种情况下会发生浮点数截断(转换为哪种数据类型时) 编译器是否对浮点数进行取整?我能告诉编译器不要凑热闹吗 感谢我发现在减去两个浮点数时发生了一个小错误,我使用了另一种方法,即ceil()和1个浮点数操作,而不是三个浮点数操作(第一种方法) 它给出了不同的结果,但这两个结果是恒定的,即0.2500992或0.2

例如,我没有得到正确精确的数字0.2500992,而是取整了数字0.2501

  • 如果数字因转换而被截断,是否存在任何编译器警告
  • 是否有任何已知的软件可以检查代码并告诉我哪些数字可能被截断
  • 在哪种情况下会发生浮点数截断(转换为哪种数据类型时)
  • 编译器是否对浮点数进行取整?我能告诉编译器不要凑热闹吗

  • 感谢

    我发现在减去两个浮点数时发生了一个小错误,我使用了另一种方法,即ceil()和1个浮点数操作,而不是三个浮点数操作(第一种方法)

    它给出了不同的结果,但这两个结果是恒定的,即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);
    }
    
    此示例显示了前面提到的以下链接中描述的浮点计算错误:

    等等,
    0.2501
    不能用
    浮点数来表示,所以你肯定没有得到它!哪种数据类型的精度高于float?撤消转换,然后查看是否获得开始时使用的值?
    double
    类型的精度通常是
    float
    的两倍(32位与64位值);
    long double
    类型可能更精确,也可能不更精确。然而,这并不能保证;这三种类型都可以映射到相同的基础类型,并且具有相同的精度。@Nizarazo:浮点运算中唯一以10为底的常见情况是打印值。所以首先,当你试图追踪这类事情时,确保你总是用过多的数字打印出你的值。对于32位IEEE浮点,“数字太多”大于24,例如,将
    %.30f
    printf
    一起使用,或者
    cout强制答案对其他阅读者没有帮助。在这两种计算中,你有什么不同之处(通常,计算机在计算中是非常确定的…),你如何知道哪一种计算的精度更高?塞巴斯蒂安在给出完整答案后减少一分是不公平的,在给出完整答案后没有减少。现在答案更有用了,所以你该走了——重点回来了。满意的
    
    ppm_f calculated by method with floating point subsctraction: 0.25009918212890625000
    ppm_f calculated by ceil method: 0.25010001659393310547