如果有符号/无符号整数被隐式转换为浮点数/双精度数,C ++如何舍入?
像:
int myInt = SomeNumberWeCantExpressWithAFloat;
float myFloat = myInt;
我的大学脚本说明如下:结果值是最接近原始值的可表示值,其中tie以实现定义的方式中断。
请解释如何计算“最接近的可表示值”以及“以实现定义的方式断开关系的含义
。编辑:
由于我大部分时间都在GCC工作,请提供有关GCC默认使用的浮点表示的其他信息(如果有的话)。
答案 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时。
在这种情况下,甚至会选择一个。这适用于负数的正数。
来源:
随意编辑。有关理性/无理数的转换规则的其他信息,请参阅。