C++ 无精度损失的类型转换
我最近注意到我正在使用的框架中的一些代码将某些变量转换为双精度变量,然后在框架访问它们时返回。在C++11标准中,对于任何整数类型,这是否保证在不损失精度的情况下工作?如果有,哪一个?在常见的实现中,对于这种转换,是否有任何其他类型是普遍安全的 还有,有没有办法在编译时检查转换是否安全?基本上我想要的是:C++ 无精度损失的类型转换,c++,c++11,type-conversion,C++,C++11,Type Conversion,我最近注意到我正在使用的框架中的一些代码将某些变量转换为双精度变量,然后在框架访问它们时返回。在C++11标准中,对于任何整数类型,这是否保证在不损失精度的情况下工作?如果有,哪一个?在常见的实现中,对于这种转换,是否有任何其他类型是普遍安全的 还有,有没有办法在编译时检查转换是否安全?基本上我想要的是: static_assert(T(double(T type))==type); 当整数类型的范围T是类型double的精确整数值范围的子范围时,保证T(double(T_值))==T_值 由
static_assert(T(double(T type))==type);
当整数类型的范围T
是类型double
的精确整数值范围的子范围时,保证T(double(T_值))==T_值
由于尾数不执行<代码>双< /C> > 16位或以下,因为据我所知,没有现存的C++实现,每字节有16位以上(<代码> CARYBIT 常数> <代码> <代码> >此保证适用于
char
和显式signed
和unsigned
变体
通常一个双精度的
有大约50+位尾数,这就足以保证对32位整数类型也有效,但对64位整数类型无效。T(双精度(T_值))==T_值
当积分类型的范围T
是双精度
类型的精确积分值范围的子范围时,保证T_值
由于尾数不执行<代码>双< /C> > 16位或以下,因为据我所知,没有现存的C++实现,每字节有16位以上(<代码> CARYBIT 常数> <代码> <代码> >此保证适用于
char
和显式signed
和unsigned
变体
通常,双精度
的尾数约为50+位,这就足以保证32位整数类型的尾数,但不能保证64位整数类型的尾数。好吧,我(大部分)解决了问题的第二部分:
#include <limits>
static_assert(T(double(std::numeric_limits<T>::max()))==std::numeric_limits::max(),"ERROR MESSAGE.");
#包括
静态_断言(T(double(std::numeric_limits::max())==std::numeric_limits::max(),“错误消息”);
好吧,我(大部分)算出了问题的第二部分:
#include <limits>
static_assert(T(double(std::numeric_limits<T>::max()))==std::numeric_limits::max(),"ERROR MESSAGE.");
#包括
静态_断言(T(double(std::numeric_limits::max())==std::numeric_limits::max(),“错误消息”);
您在自己的代码中使用的类型是什么?您是否有理由不首先使用double
来避免这些转换?@code peedient这些类型是由框架设置的(即,我无法更改它们)。例如,m_type
在内部是一个unsigned int
,但当通过框架访问它时,它会转换为double
@code peedient。此外,我正在将它们转换回原始类型以节省空间。之后我将对它们进行序列化,即使进行了这种转换,它仍将占用大约1 TB的空间,因此在这一级别上进行优化非常重要。我不认为您可以对框架的内部结构做太多的工作。@Code学徒我同意。我的问题是,例如,unsigned int
到double
再到unsigned int
的转换是否会成为问题(即,可能会返回与原始值不完全相同的位)。如果是这样的话,我将不得不完全放弃这个框架,并想出其他的办法。如果没有,那么一切都很好。您在自己的代码中使用了哪些类型?您是否有理由不首先使用double
来避免这些转换?@code peedient这些类型是由框架设置的(即,我无法更改它们)。例如,m_type
在内部是一个unsigned int
,但当通过框架访问它时,它会转换为double
@code peedient。此外,我正在将它们转换回原始类型以节省空间。之后我将对它们进行序列化,即使进行了这种转换,它仍将占用大约1 TB的空间,因此在这一级别上进行优化非常重要。我不认为您可以对框架的内部结构做太多的工作。@Code学徒我同意。我的问题是,例如,unsigned int
到double
再到unsigned int
的转换是否会成为问题(即,可能会返回与原始值不完全相同的位)。如果是这样的话,我将不得不完全放弃这个框架,并想出其他的办法。如果没有,那么一切都很好。