解释 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") >> x).get(c)
足以说明您的观点。以上是关于解释 C++ 中非规范化双精度的打印的主要内容,如果未能解决你的问题,请参考以下文章
打印精度高达小数点后 4 位的双精度数据类型 - Armadillo