如何在C++中将double转换为int时检查溢出/下溢?

huangapple go评论81阅读模式
英文:

How can I check over-/underflow when converting double to int in C++?

问题

当学习关于static_castdynamic_cast时,我看到了一个关于在将double类型转换为int类型时进行溢出和下溢的额外检查的建议。我该如何在这里执行这个操作?

    double value1{ 4.8967 };
    int value2 = static_cast<int>(value1);
    std::cout << value2 << std::endl;

我尝试在这里和那里搜索,只找到了算术溢出/下溢,似乎不太适用于这种情况。我会很感激如果您能提供一些我可以更详细了解这个问题的链接。

英文:

when learning about static_cast and dynamic_cast i saw an advice about additional checking on overflow and underflow when casting double type into int one. how can i do that here?

    double value1{ 4.8967 };
    int value2 = static_cast&lt;int&gt;(value1);
    std::cout &lt;&lt; value2 &lt;&lt; std::endl;

i tried searching here and there only to found an arithmetic over-/underflow which seems not quite the case here. i'd appresiate a couple of links where i can read about it more specifically

答案1

得分: 2

你可以使用 std::numeric_limits 创建一个辅助函数来避免溢出。如果有下溢,则可以获得最小可能的 int 值,如果有溢出,则可以获得最大可能的 int 值。

#include &lt;iostream&gt;
#include &lt;limits&gt;  // numeric_limits

template &lt;class R, class T&gt;
R anti_overflow_clamp(T value) {
    if (value &lt;= std::numeric_limits&lt;R&gt;::lowest()) [[unlikely]]
        return std::numeric_limits&lt;R&gt;::lowest();

    if (std::numeric_limits&lt;R&gt;::max() &lt;= value) [[unlikely]]
        return std::numeric_limits&lt;R&gt;::max();

    return static_cast&lt;R&gt;(value);
}

int main() {
    double value1 = -9872034875209384574237698276453978264398576.0;

    auto value2 = anti_overflow_clamp&lt;int&gt;(value1);

    std::cout &lt;&lt; value2 &lt;&lt; &#39;\n&#39;; // int 的最小值
}
英文:

You could use std::numeric_limits create a helper function to avoid overflowing. You'd then get the minimum possible int value if there would be an underflow or the maximum possible int value if there would be an overflow.

#include &lt;iostream&gt;
#include &lt;limits&gt;  // numeric_limits

template &lt;class R, class T&gt;
R anti_overflow_clamp(T value) {
    if (value &lt;= std::numeric_limits&lt;R&gt;::lowest()) [[unlikely]]
        return std::numeric_limits&lt;R&gt;::lowest();

    if (std::numeric_limits&lt;R&gt;::max() &lt;= value) [[unlikely]]
        return std::numeric_limits&lt;R&gt;::max();

    return static_cast&lt;R&gt;(value);
}

int main() {
    double value1 = -9872034875209384574237698276453978264398576.0;

    auto value2 = anti_overflow_clamp&lt;int&gt;(value1);

    std::cout &lt;&lt; value2 &lt;&lt; &#39;\n&#39;; // min value for int
}

huangapple
  • 本文由 发表于 2023年7月27日 20:37:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/76779808.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定