关于数据丢失的警告c ++/c

Dr *_*Deo 9 c c++ visual-c++

我正在收到关于可能的数据丢失的良性警告

警告C4244:'argument':从'const int'转换为'float',可能会丢失数据

我记得浮动的精度比int大.那么如果我从较小的数据类型(int)转换为更大的数据类型(float),数据如何丢失?

zne*_*eak 14

因为float 数字不准确.即使inta float的最大值float更高,也无法表示可以容纳的所有可能值.

例如,运行这个简单的程序:

#include <stdio.h>

int main()
{
 for(int i = 0; i < 2147483647; i++)
 {
  float value = i;
  int ivalue = value;
  if(i != ivalue)
   printf("Integer %d is represented as %d in a float\n", i, ivalue);
 }
}
Run Code Online (Sandbox Code Playgroud)

您很快就会发现有数千亿的整数无法表示为floats.例如,范围16,777,219和16,777,221之间的所有整数表示为16,777,220.

再次编辑运行上面的程序表明有2,071,986,175个 整数不能精确表示为floats.这使得你大致只有1亿正整数适合一个正整数float.这意味着当你将它放入浮点数时,只有21中的一个整数是正确的.

我希望负整数的数字相同.

  • @Dr Deo:“i”是一个整数,然后我将其转换为“float”。如果精度没有丢失,那么将其转换回整数将返回相同的数字。事实并非如此。 (2认同)

JSB*_*ոգչ 6

在大多数体系结构上int并且float大小相同,因为它们具有相同的位数.但是,在浮点数中,这些位在指数和尾数之间分开,这意味着浮点数中的精度位数实际上比int小.但是,对于较大的整数,这可能只是一个问题.

在a int为32位的系统上,a double通常为64位,因此可以精确地表示任何int.