int 到 double 转换会向上、向下四舍五入还是最接近的 double?

Will int to double conversion round up, down or to nearest double?

提问人:glades 提问时间:3/8/2023 更新时间:3/8/2023 访问量:1214

问:

简单的问题:从 int(比如 100)转换为双精度“四舍五入”到下一个双精度,还是总是四舍五入到最接近的双精度(最小增量)?

例如:static_cast<double>(100)

Casting from int to double

如果 d2 < d1,它会以哪种方式投射?

奖励问题:我是否可以以某种方式强制处理器使用特殊功能向下或向上“舍入”到收盘价双倍?在我看来,没有或不幸的是。floor<double>ceil<double>

C++ 舍入静态 强制 浮点转换

评论

6赞 Alan Birtles 3/8/2023
假设是 32 位,它将始终转换为精确值(再次假设 64 位 IEEE-754 双精度)。请参阅实际浮整数转换,了解其他情况下的规则intdouble
6赞 wohlstad 3/8/2023
对于小于 ~2^53 (9007199254740992) 的值,没有问题 - 它们可以精确地表示(请参阅此处:stackoverflow.com/questions/1848700/...)。然而,对于大于此值的值,问题仍然存在(您需要一个 64 位整数)。double
1赞 glades 3/8/2023
@wohlstad 我认为您的意思是“完全表示”,往返转换将产生完全相同的整数值。只有 2 的幂可以精确地表示为浮点类型。
4赞 wohlstad 3/8/2023
@glades为什么你认为只有 2 的幂才能准确表示?A 通常有 53 位螳螂。您可以获得至少大约 2^53 个值的精确表示,而不仅仅是 2 的幂(例如,通过将指数设置为 2^0)。double
7赞 Alan Birtles 3/8/2023
不,任何最大为 2^53 的整数都可以精确表示,而不仅仅是 2 的幂,然后是其他最大为 2^54 的整数,每 4 个最大为 2^55 等。

答:

14赞 Alan Birtles 3/8/2023 #1

请注意,32 位可以精确地用 64 位 IEEE 754 表示(它实际上可以精确地表示多达 53 位整数)。intdouble

如果您使用的整数大于浮点类型所能表示的整数,则适用实数浮点整数转换中的规则:

  • 如果该值可以表示,但不能精确表示,则结果是最接近的较高值或最接近的较低值(换句话说,舍入方向是实现定义的),尽管如果支持 IEEE 算术,则舍入是最接近的。在这种情况下是否提出FE_INEXACT没有具体说明。
  • 如果无法表示该值,则行为未定义,但如果支持 IEEE 算术,则会提高FE_INVALID并且未指定结果值。

没有 c++ 标准函数来控制舍入模式,大多数实现将使用 IEEE 舍入到最接近。

评论

0赞 supercat 3/9/2023
第一个要点的括号注释与前面的文本不同。前面的文本将适应这样一种可能性,即实现可能会以未指定的方式在生成下一个较高值或下一个较低值之间进行选择,这可能允许在两个值同样有效的情况下进行一些优化。
0赞 Alan Birtles 3/9/2023
@supercat不明白你的意思?报价直接来自 cppreference
1赞 supercat 3/9/2023
@AlanBirtles:这是草率的写作,无论它来自哪里。短语“换句话说”应该出现在含义相同但单词不同的文本片段之间。如果前面和后面的文本。如果要求实现在所有情况下都记录他们将如何选择舍入方向,则文本应说“此外,必须以实现定义的方式选择是向上舍入还是向下舍入”,并且如果不需要实现精确地记录事物,则选择为“未指定”,并声明它是......
0赞 supercat 3/9/2023
...“实现定义”是错误的。
0赞 Mark 3/9/2023
@supercat,我阅读它的方式是,如果使用 IEEE 算术,则使用 IEEE 规则四舍五入到最接近的值。如果不使用 IEEE 算术,则实现可以根据任何看起来合适的规则选择最接近的较高值或最接近的较低值。