【问题标题】:assert that a double can fit into an int断言 double 可以放入 int
【发布时间】:2016-11-17 22:41:21
【问题描述】:

我不太确定double 是否具有标准化表示,这就是我想问的原因,是否有一种编写assert 的好方法可以确保double 中的值很小足以适应int64_t

更具体地说,int64_tdouble 之间的比较可能超出了前者的范围,并保证正确?

【问题讨论】:

标签: c++ c++11 int double overflow


【解决方案1】:

这样的事情会起作用:

assert(std::numeric_limit<int64_t>::min() <= value
       && value <= std::numeric_limits<int64_t>:::max()

【讨论】:

  • 在可能大于int64_tdoubleint64_t 之间的比较是否明确?
  • @Curious 我会另外介绍static_cast。其实都很好定义。
  • 但是否保证int64_tdouble 之间的转换不会丢失任何精度,从而导致不正确的结果?
  • @Curious:如果您还需要验证double 是否为整数值,也可以使用assert(int64_t(value) == value);
  • 注意:在使用限制时,您通常希望最低()而不是 min() - 它们实际上是整数类型的相同值(所以上面的代码是正确的),但对于浮点数和双精度数 min( ) 是一个非常小的正浮点值,lowest() 是真正的最小值...
【解决方案2】:

您可以通过检查类型限制来尝试。

#include <iostream>
#include <climits>
#include <cassert>

using namespace std;

int main()
{
    double val = static_cast<double>(LONG_MAX); // or LONG_MIN

    assert((static_cast<long int>(val) > LONG_MIN) && (static_cast<long int>(val) < LONG_MAX));
    cout << static_cast<long int>(val) << '\n';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    相关资源
    最近更新 更多