【发布时间】:2016-11-17 22:41:21
【问题描述】:
我不太确定double 是否具有标准化表示,这就是我想问的原因,是否有一种编写assert 的好方法可以确保double 中的值很小足以适应int64_t?
更具体地说,int64_t 和 double 之间的比较可能超出了前者的范围,并保证正确?
【问题讨论】:
标签: c++ c++11 int double overflow
我不太确定double 是否具有标准化表示,这就是我想问的原因,是否有一种编写assert 的好方法可以确保double 中的值很小足以适应int64_t?
更具体地说,int64_t 和 double 之间的比较可能超出了前者的范围,并保证正确?
【问题讨论】:
标签: c++ c++11 int double overflow
这样的事情会起作用:
assert(std::numeric_limit<int64_t>::min() <= value
&& value <= std::numeric_limits<int64_t>:::max()
【讨论】:
int64_t 的double 和int64_t 之间的比较是否明确?
static_cast。其实都很好定义。
int64_t 和double 之间的转换不会丢失任何精度,从而导致不正确的结果?
double 是否为整数值,也可以使用assert(int64_t(value) == value);
您可以通过检查类型限制来尝试。
#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';
}
【讨论】: