小编Jul*_*off的帖子

将积分转换为浮点类型时检测溢出

C++标准,据我所知,C++也依赖于这些问题,它具有以下部分:

当整数类型的值转换为实际浮动类型时,如果正在转换的值可以在新类型中准确表示,则它将保持不变.如果转换的值在可以表示但不能精确表示的值的范围内,则结果是以实现定义的方式选择的最接近的较高或最接近的较低可表示值.如果要转换的值超出可以表示的值范围,则行为未定义.

有什么方法可以检查最后一个案例吗?在我看来,这最后一个未定义的行为是不可避免的.如果我有一个整数值,i并天真地检查类似的东西

i <= FLT_MAX
Run Code Online (Sandbox Code Playgroud)

我将(除了与精度相关的其他问题)已经触发它,因为比较首先转换i为a float(在这种情况下或通常为任何其他浮动类型),因此如果它超出范围,我们将得到未定义的行为.

或者是否有一些关于积分和浮动类型的相对大小的保证,这意味着"浮点数总是代表int的所有值(当然不一定完全正确)",或者至少"long double可以始终包含所有内容",这样我们就可以了可以做那种类型的比较?但是我找不到那样的东西.

这主要是一个理论练习,所以我对"在大多数架构中这些转换始终有效"的答案不感兴趣.让我们试着找到一种方法来检测这种溢出而不假设超出C(++)标准!:)

c c++ floating-point undefined-behavior language-lawyer

5
推荐指数
1
解决办法
233
查看次数