相关疑难解决方法(0)

如果浮点范围更大,是否通过浮点往返定义行为?

假设我有两种算术类型,一个整数I,一个浮点数,F.我还假设std::numeric_limits<I>::max()小于std::numeric_limits<F>::max().

现在,假设我有一个正整数值i.因为可表示的范围F大于I,F(i)应始终定义行为.

但是,如果我有一个浮点值f,那么f == F(i),是否I(f)定义明确?换句话说,I(F(i))总是定义行为?


C++ 14标准的相关部分:

4.9浮动积分转换 [conv.fpint]

  1. 可以将浮点类型的prvalue转换为整数类型的prvalue.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.[ 注意:如果目的地类型是bool,请参见4.12.- 结束说明 ]
  2. 可以将整数类型或无范围枚举类型的prvalue转换为浮点类型的prvalue.如果可能,结果是准确的.如果要转换的值在可以表示的值范围内,但该值无法准确表示,则它是实现定义的下一个较低或较高可表示值的选择.[ 注意:如果积分值不能完全表示为浮动类型的值,则会发生精度损失.- 结束注释 ]如果转换的值超出了可以表示的值范围,则行为未定义.如果源类型为bool,则将值 false转换为零,并将值true转换为1.

c++ language-lawyer floating-point-conversion c++14

8
推荐指数
1
解决办法
157
查看次数