解释 C++ 中非规范化双精度的打印

Posted

技术标签:

【中文标题】解释 C++ 中非规范化双精度的打印【英文标题】:Interprete the print out of a denormalized double in C++ 【发布时间】:2013-05-07 13:24:56 【问题描述】:

C++程序打印出下面的数字是什么意思,H到底是什么意思?

-6.38442e-86H

整个系统太大了,无法在这里添加,但是这里是打印出特定双精度的代码。

try
    newLogLikelihoodEM= hmm->learningLogLikelihood(data, Arglist::getDiffLogLikelihood(), fileNumbers, rng);

catch (SingularCovarianceMatrixException &scme)

    std::cout << scme.what() << ": doing learning, so restarts for this start-point" << std::endl;
    noRestarts++;
    restart = true;

以及异常类

class SingularCovarianceMatrixException: public std::exception

    double det;
public:
    SingularCovarianceMatrixException(double det):det(det);

    virtual const char* what() const throw()
    

        std::stringstream msg;
        msg<< "Singular covariance matrix: determinant="<<det;

        return msg.str().c_str();
    
;

并且异常被抛出

if(*detCovarianceMatrix<1e-300)

    throw SingularCovarianceMatrixException(*detCovarianceMatrix);

【问题讨论】:

您能添加生成此输出的代码吗? 这不正常;非正规从1.0p-1022,~2.2250738585072014e-308开始。 这意味着程序所做的不仅仅是打印出值,但是由于这里没有代码,所以无法知道那是什么。 这里是sn-ps的代码。我不明白这个数字或 H 是如何打印出来的,因为它不低于 1e-300 但感谢您的帮助。 【参考方案1】:

H 不是号码的一部分。这不是浮点数的有效后缀。您代码中的其他内容应该会打印出来。

【讨论】:

你忘了回答问题的另一部分。 @0x499602D2 对不起,我不明白你指的是哪个部分 C++程序打印出以下数字是什么意思...? 我相信我的最后一句话回答了这个问题。这不是数字打印值的一部分。 他最初指的是以指数形式打印的数字。然后他问最后H是什么。【参考方案2】:

H 不是有效的浮点后缀,我找不到很好的参考来证明这一点,但我们可以证明使用此代码它不是有效的转换:

#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>

class BadConversion : public std::runtime_error 
public:
  BadConversion(std::string const& s)
    : std::runtime_error(s)
     
;

inline double convertToDouble(std::string const& s,
                              bool failIfLeftoverChars = true)

  std::istringstream i(s);
  double x;
  char c;
  if (!(i >> x) || (failIfLeftoverChars && i.get(c)))
    throw BadConversion("convertToDouble(\"" + s + "\")");
  return x;


int main()

    double d1 = convertToDouble("-6.38442e-86") ;
    std::cout << d1 << std::endl ;
    d1 = convertToDouble("-6.38442e-86H");
    std::cout << d1 << std::endl ;

我从以前的answers 中获取的代码是关于如何检查string 是否为integer

【讨论】:

(istringstream("-6.38442e-86H") &gt;&gt; x).get(c) 足以说明您的观点。

以上是关于解释 C++ 中非规范化双精度的打印的主要内容,如果未能解决你的问题,请参考以下文章

提取双精度数的分数系数

C# double 的尾数规范化

16 位双精度值的最大值(和最小值)是多少?

打印精度高达小数点后 4 位的双精度数据类型 - Armadillo

我应该在 DocumentDb 中非规范化还是运行多个查询?

单精度与双精度