提问人:glades 提问时间:3/8/2023 更新时间:3/8/2023 访问量:1214
int 到 double 转换会向上、向下四舍五入还是最接近的 double?
Will int to double conversion round up, down or to nearest double?
问:
简单的问题:从 int(比如 100)转换为双精度“四舍五入”到下一个双精度,还是总是四舍五入到最接近的双精度(最小增量)?
例如:static_cast<double>(100)
如果 d2 < d1,它会以哪种方式投射?
奖励问题:我是否可以以某种方式强制处理器使用特殊功能向下或向上“舍入”到收盘价双倍?在我看来,没有或不幸的是。floor<double>
ceil<double>
答:
14赞
Alan Birtles
3/8/2023
#1
请注意,32 位可以精确地用 64 位 IEEE 754 表示(它实际上可以精确地表示多达 53 位整数)。int
double
如果您使用的整数大于浮点类型所能表示的整数,则适用实数浮点整数转换中的规则:
- 如果该值可以表示,但不能精确表示,则结果是最接近的较高值或最接近的较低值(换句话说,舍入方向是实现定义的),尽管如果支持 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 算术,则实现可以根据任何看起来合适的规则选择最接近的较高值或最接近的较低值。
评论
int
double
double
double