从无符号整数到浮点数的转换

6
warning C4244: '=' : conversion from 'unsigned int' to 'float', possible loss of data  

浮点数不应该能够处理int类型的任何值吗?

unsigned int: 0 to 4,294,967,295  
float 3.4E +/- 38 (7 digits) 

维基百科:

The advantage of floating-point representation over fixed-point (and

integer) representation is that it can support a much wider range of values.

任何见解都将有所帮助,谢谢。 http://msdn.microsoft.com/en-us/library/s3f49ktz%28VS.80%29.aspx
5个回答

13

'unsigned int' 和 'float' 都使用32位存储值。由于float具有更大的范围,它必然会牺牲一些精度。这意味着有些无符号整数值在float中无法准确表示。MSDN 提供了更多细节。


1
MSDN链接是关于C#的参考资料,而不是C++。 - Omer

8
虽然 float 支持比 unsigned int 更广泛的值,但精度却更低。浮点数具有23位尾数,只能表示约7个十进制数字。无符号整数支持超过9个十进制数字。
建议使用 double 而不是 float
编辑: 实际上,我撤回了那个建议;浮点数和整数数据类型在本质上是不同的,不能直接转换。您期望得到什么整数值作为 Single.MaxValue?对于 Single.NegativeInfinity 呢?解释为什么要从 float 转换为 int 将会很有帮助。

1
我认为他是在进行从整数到浮点数的转换。不过,了解“为什么”肯定会有所帮助。 - JaredReisinger

3
正如你在问题中提到的那样,浮点数只能容纳7位数字,而INT_MAX可以容纳10位数字。我相信这就是进行转换时出现C4244警告的原因。

是的,我看到了,但是根据小数点的位置,即使数字较少,我们不应该能够表示更大的数字吗? - T.T.T.
@Tommy:你可能想阅读http://en.wikipedia.org/wiki/Floating_point 了解更多关于浮点数值如何表示的知识,特别是位数如何在尾数和指数之间分配。 - JaredReisinger
2
@Tommy - float类型可以处理数值范围,但会失去精度(即,最低有效数字将不再可用)。这是数据丢失,因此警告是合适的。 - Michael Burr
尝试将4_000_000_000和4_000_000_001存储在浮点数中,看看它们的值是多少。 - sarnold

3

来自维基百科

单精度,C语言系列中称为“float”,Fortran中称为“real”或“real*4”。这是一种二进制格式,占用32位(4字节),其有效数字具有24位精度(约7个十进制数字)。

由于int通常具有32位(与部分保留的指数一起),因此有很多int值无法被浮点类型精确表示。


2

尝试这样做以了解情况。

float f = 0.0f;
while (f < (INT_MAX-1))
   f++;

您会发现,在 int 为 32 位或更低的系统上,这实际上是一个无限循环。

有趣的是,我们可以打破这个无限循环,看看 f 的值是多少,以使得 f == f + 1。


限制是exp(2, 24),因为float只有24个有效位。printf("%f\n", float(1<<24)+1)打印出一个偶数,显然是错误的。 - fredoverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接