相关疑难解决方法(0)

双面打印而不失精度

如何在流中打印双精度数,以便在读入时不会丢失精度?

我试过了:

std::stringstream ss;

double v = 0.1 * 0.1;
ss << std::setprecision(std::numeric_limits<T>::digits10) << v << " ";

double u;
ss >> u;
std::cout << "precision " << ((u == v) ? "retained" : "lost") << std::endl;
Run Code Online (Sandbox Code Playgroud)

这不像我预期的那样有效.

但我可以提高精度(这让我感到惊讶,因为我认为数字10是所需的最大值).

ss << std::setprecision(std::numeric_limits<T>::digits10 + 2) << v << " ";
                                                 //    ^^^^^^ +2
Run Code Online (Sandbox Code Playgroud)

它与有效位数有关,前两位不计入(0.01).

那么有人看过准确表示浮点数吗?我需要做的流上究竟是什么神奇的咒语?

经过一些实验:

问题在于我的原始版本.小数点后面的字符串中有无效数字会影响精度.

因此,为了弥补这一点,我们可以使用科学记数法来补偿:

ss << std::scientific
   << std::setprecision(std::numeric_limits<double>::digits10 + 1)
   << v;
Run Code Online (Sandbox Code Playgroud)

这仍然不能解释+1的必要性.

此外,如果我以更高的精度打印出数字,我会得到更高的精度!

std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10) << v << "\n";
std::cout << std::scientific …
Run Code Online (Sandbox Code Playgroud)

c++ floating-point iostream

32
推荐指数
5
解决办法
2万
查看次数

double和stringstream格式

double val = 0.1;
std::stringstream ss;
ss << val;
std::string strVal= ss.str();
Run Code Online (Sandbox Code Playgroud)

在Visual Studio调试器中,val值为0.10000000000000001(因为无法表示0.1).当val使用stringstream转换时,strVal等于"0.1".但是,当使用boost :: lexical_cast时,结果strVal"0.10000000000000001".

另一个例子如下:

double val = 12.12305000012;

在visual studio下val显示为12.123050000119999,并使用stringstream和默认精度(6)它变为12.1231.我真的不明白为什么它不是12.12305(...).

是否存在默认精度,或者stringstream是否有特定的算法来转换无法准确表示的double值?

谢谢.

c++ double

11
推荐指数
3
解决办法
4万
查看次数

Matlab与C++双精度

我正在将一些代码从Matlab移植到C++.

在Matlab中

format long
D = 0.689655172413793 (this is 1.0 / 1.45)
E = 2600 / D
// I get E = 3.770000000000e+03
Run Code Online (Sandbox Code Playgroud)

在C++中

double D = 0.68965517241379315; //(this is 1.0 / 1.45)
double E = 2600 / D;
//I get E = 3769.9999999999995
Run Code Online (Sandbox Code Playgroud)

对我来说这是一个问题,因为在这两种情况下我都必须向下舍入到0(Matlab的修正),在第一种情况下(Matlab)变为3770,而在第二种情况下(C++)它变为3769.

我意识到这是因为C++案例中有两个额外的最低有效数字"15".鉴于Matlab似乎只能在双精度中存储多达15位有效精度数字(如上图所示 - 0.689655172413793),我怎样才能有效地告诉C++忽略后面的"15"?

所有计算都以双精度完成.

c++ floating-point precision matlab ieee-754

3
推荐指数
1
解决办法
1231
查看次数

如何区分1和零浮点值?

我知道这可能是一个noob问题,但由于我正在研究的电子书中没有涉及,我会问它.在IEEE标准二进制浮点格式中,实际上用科学记数法表示数字我知道一个整数值总是假设被添加到二进制的有效部分所示的小数部分并且不包含在二进制中,那么什么混淆我是如何区分1和零浮点值,因为我假设两者都有一个完全零有效数,我想这里的区分应该由指数部分完成,但不知道如何!

format floating-point assembly

0
推荐指数
1
解决办法
283
查看次数