有没有办法意识到一个数字是否由于转换而被截断

Is there any way to realize if a number is truncated due to conversion?

本文关键字:于转换 转换 数字 意识到 有没有 一个 是否      更新时间:2023-10-16

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

例如,我得到的不是正确和精确的数字 0.2500992,而是四舍五入的数字 0.2501。

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

谢谢

我发现减去两个浮点数时发生了一个小错误,我使用另一种方法是 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: %.20fn",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: %.20fn",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