C ++如何将int舍入为float / double?

时间:2016-10-22 14:48:51

标签: c++ floating-point type-conversion implicit-conversion

如果有符号/无符号整数被隐式转换为浮点数/双精度数,C ++如何舍入?

像:

int myInt = SomeNumberWeCantExpressWithAFloat;
float myFloat = myInt;

我的大学脚本说明如下:结果值是最接近原始值的可表示值,其中tie以实现定义的方式中断。

请解释如何计算“最接近的可表示值”以及“以实现定义的方式断开关系的含义

编辑:
由于我大部分时间都在GCC工作,请提供有关GCC默认使用的浮点表示的其他信息(如果有的话)。

2 个答案:

答案 0 :(得分:1)

单精度浮点数具有24位尾数。在32位int表示值大于2 24 及以下 - (2 24 )的系统上需要舍入。

值2 24 +1 = 16777217是第一个无法用IEEE binary32格式精确表示的float。有两个{{1}}表示可用 - 16777216,低于精确值1,而16777218高于精确值,也是1.因此,我们有一个平局,这意味着允许C ++选择这两种表述中的一种。

答案 1 :(得分:1)

IEEE 754规定了有关如何舍入整数的5种不同的舍入模式:

一种非常常见的模式叫做: 舍入到最近,与...连接

来自GCC Wiki:

  

没有任何明确的选项,GCC假定舍入到最近或甚至和   不关心信号NaNs。与C99的#pragma STDC比较   FENV ACCESS OFF。另请参阅x86和m68080上的注释。

舍入到最近,连接到

来自维基百科:

  

将数字y舍入到最接近的整数需要一些打破平局   当y恰好在两个整数之间的中间时 - 那些情况的规则 -   也就是说,当y的分数部分正好是0.5时。

在这种情况下,甚至会选择一个。这适用于负数的正数。

来源:

随意编辑。有关理性/无理数的转换规则的其他信息,请参阅。