C++ 使用boost::numeric_cast<;有什么目的吗;双倍>;(长)(即从长转换为双)?

C++ 使用boost::numeric_cast<;有什么目的吗;双倍>;(长)(即从长转换为双)?,c++,boost,C++,Boost,我认为这种转换不会失败。因此,boost::numeric\u cast(long)应该产生与常规cast相同的结果。这是正确的吗?如果是这样,为什么boost::numeric_cast比常规cast慢?是否正在进行某种检查?来自: 缺少范围的保留使得数字类型之间的转换容易出错。隐式转换和显式转换(通过静态_cast)都是如此。转换数值类型时,numeric_cast检测范围丢失,如果无法保留范围,则引发异常 因此,看起来boost的数字强制转换会执行一些额外的检查,并可能引发异常——因此它们

我认为这种转换不会失败。因此,
boost::numeric\u cast(long)
应该产生与常规cast相同的结果。这是正确的吗?如果是这样,为什么
boost::numeric_cast
比常规cast慢?是否正在进行某种检查?

来自:

缺少范围的保留使得数字类型之间的转换容易出错。隐式转换和显式转换(通过静态_cast)都是如此。转换数值类型时,numeric_cast检测范围丢失,如果无法保留范围,则引发异常


因此,看起来boost的数字强制转换会执行一些额外的检查,并可能引发异常——因此它们并不总是与“常规强制转换”相同((1所有,但文档中也指出:
实现必须保证转换为可以保存源类型所有可能值的类型时,不会有运行时开销。
@jhourback如果double和long都是64位,则double不能保存long的所有可能值,精度相同(符号和尾数需要一些位)只剩下53位。基本上,也可以这样表达:“如果将类型
X
强制转换为类型
Y
,并且
X
的所有值都可以保存在
Y
中,则强制转换不会产生任何开销。”--但并非所有
numeric\u cast
可以处理的强制转换都是如此……例如,将
uint8\u t
强制转换为
uint16\u t
不会产生任何开销,但强制转换另一个方向可能会产生开销。可以存储在双精度中的最大整数——您是否正在对这些类型的大小进行假设?如果两者都
long
double
是64位(通常是64位),因此无法将每个
long
值加上分数值放入
double
中。
static_assert((1ull<<57ull)!=(1+(1ull<<57ull)));
static_assert((double)(1ull<<57ull)==(double)(1+(1ull<<57ull)));