如何在流中打印双精度数,以便在读入时不会丢失精度?
我试过了:
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) 当我通过步进代码在VS C++中调试我的软件时,我注意到一些浮点计算显示为带有尾点的数字,即:
1232432.
Run Code Online (Sandbox Code Playgroud)
导致此结果的一个操作是:
float result = pow(10, a * 0.1f) / b
Run Code Online (Sandbox Code Playgroud)
其中a是-50到-100左右的大负数,b最常见的是1.我在浮点数时读过一些关于精度问题的文章.我的问题是,如果尾随点是Visual-Studio方式,告诉我该数字的精度非常低,即在变量结果中.如果没有,这是什么意思?
今天出现了这个问题,我记得大数字存在问题所以每次都会发生这种情况(并且"这个"我指的是尾随点).但我确实记得它发生在数字中有七位数时.他们在这里怀疑浮点数的精度是七位数:
这可能是事情,Visual Studio通过在最后添加一个点告诉我这个吗?
我想我发现了它!它说"尾数被指定为一个数字序列,后跟一个句号".尾数是什么意思?这可以在PC上以及在DSP上运行代码时有所不同吗?因为事情是我得到了不同的结果,唯一对我来说很奇怪的是这个时期的东西,因为我不知道它意味着什么.
http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=vs.71).aspx
在C++ Qt Library中有一个函数QRect screenGeometry().QRect有功能int width()和int height().如果我将此函数的结果保存到int变量,那么除法效果很好,但如果我直接在除法中使用此函数之一,则会产生奇怪的结果:
QRect scr_size = QApplication::desktop()->screenGeometry();
int a = 1280;
int b = 720;
int c = scr_size.width();
int d = scr_size.height();
qDebug() << c; // 1920
qDebug() << d; // 1080
qDebug() << ((float(a) / b) - (float(c) / d)); // 0
qDebug() << ((float(a) / b) - (float(scr_size.width()) / d)); // 1.32455e-08
qDebug() << ((float(a) / b) - (float(c) / scr_size.height())); // 1.32455e-08
qDebug() …Run Code Online (Sandbox Code Playgroud)