相关疑难解决方法(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万
查看次数

浮点数末端的点是否表示缺乏精确度?

当我通过步进代码在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方式,告诉我该数字的精度非常低,即在变量结果中.如果没有,这是什么意思?

今天出现了这个问题,我记得大数字存在问题所以每次都会发生这种情况(并且"这个"我指的是尾随点).但我确实记得它发生在数字中有七位数时.他们在这里怀疑浮点数的精度是七位数:

C++浮点除法和精度

这可能是事情,Visual Studio通过在最后添加一个点告诉我这个吗?

我想我发现了它!它说"尾数被指定为一个数字序列,后跟一个句号".尾数是什么意思?这可以在PC上以及在DSP上运行代码时有所不同吗?因为事情是我得到了不同的结果,唯一对我来说很奇怪的是这个时期的东西,因为我不知道它意味着什么.

http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=vs.71).aspx

c++ floating-point visual-studio floating-point-precision

5
推荐指数
1
解决办法
2261
查看次数

C++ float和int division奇怪的行为

在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)

c++ qt

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