【问题标题】:Type conversions without loss of precision在不损失精度的情况下进行类型转换
【发布时间】:2016-08-23 06:27:33
【问题描述】:

我最近刚刚注意到我正在使用的框架中的一些代码将某些变量转换为双精度值,然后在框架访问它们时返回。在 C++11 标准中,这是否保证在不损失任何整数类型的精度的情况下工作?如果是这样,是哪个?在常见的实现中,是否有任何其他类型对于这种转换是普遍安全的?

另外,有没有办法在编译时检查以这种方式进行的转换是否安全?基本上我想要这样的东西:

static_assert(T(double(T type))==type);

【问题讨论】:

  • 您在自己的代码中使用了哪些类型?您是否有理由不使用 double 来避免这些转化?
  • @Code-Apprentice 类型由框架设置(即我无法更改它们)。例如,m_type 在内部是一个unsigned int,但是当通过框架访问它时,它被转换为一个double
  • @Code-Apprentice 此外,我将它们转换回原始类型以节省空间。之后我对它们进行序列化,即使进行了这种转换,它仍然占用大约 TB 的空间,所以在这个级别上的优化非常重要。
  • 我不认为你可以对框架的内部做很多事情。
  • @Code-Apprentice 我同意。我的问题是,例如,从unsigned intdouble 再到unsigned int 的转换是否会成为问题(即,是否可以返回与原始内容不同的位)。如果是这样,我将不得不完全放弃框架并找出其他东西。如果没有,那么一切都很好。

标签: c++ c++11 type-conversion


【解决方案1】:

当整数类型T 的范围是double 类型的精确整数值范围的子范围时,保证T(double(T_value))==T_value

由于 double 的实现没有尾数为 16 位或更少,而且据我所知,没有现有的 C++ 实现每字节超过 16 位(<limits.h> 中的 CHAR_BIT 常量),此保证适用于 char 和明确的 signedunsigned 变体。

通常,double 有大约 50 多位尾数,这足以保证也适用于 32 位整数类型,但不适用于 64 位。

【讨论】:

    【解决方案2】:

    嗯,我(大部分)想出了问题的第二部分:

    #include <limits>
    static_assert(T(double(std::numeric_limits<T>::max()))==std::numeric_limits::max(),"ERROR MESSAGE.");
    

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 2016-12-06
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多