设置C ++中的默认浮点打印精度 [英] Set back default floating point print precision in C++

查看:214
本文介绍了设置C ++中的默认浮点打印精度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在比较期间将精度控制为双精度,然后使用C ++恢复到默认精度.

我打算使用setPrecision()设置精度.那么,将精度设置为默认值的语法是什么?

我正在做这样的事情

std::setPrecision(math.log10(m_FTOL));

我做了一些事情,之后我想回到默认的双重比较.

我这样修改,但仍然有一些错误

std::streamsize prec = std::ios_base::precision();
std::setprecision(cmath::log10(m_FTOL));

,其中cmath在编译时为false,std::ios_base在编译时也为false.你能帮忙吗?

解决方案

使用std::ios_base::precision,可以在更改精度之前获得 ,然后使用该精度将其更改回来.

您可以通过以下方式看到此效果:

#include <ios>
#include <iostream>
#include <iomanip>

int main (void) {
    double d = 3.141592653589;
    std::streamsize ss = std::cout.precision();
    std::cout << "Initial precision = " << ss << '\n';

    std::cout << "Value = " << d << '\n';

    std::cout.precision (10);
    std::cout << "Longer value = " << d << '\n';

    std::cout.precision (ss);
    std::cout << "Original value = " << d << '\n';

    std::cout << "Longer and original value = "
        << std::setprecision(10) << d << ' '
        << std::setprecision(ss) << d << '\n';

    std::cout << "Original value = " << d << '\n';

    return 0;
}

输出:

 Initial precision = 6
Value = 3.14159
Longer value = 3.141592654
Original value = 3.14159
Longer and original value = 3.141592654 3.14159
Original value = 3.14159
 

上面的代码显示了两种设置精度的方法,一种是调用std::cout.precision (N),另一种是使用流操纵器std::setprecision(N).


但是您需要记住,精度是通过流输出 值的精度,它不会直接影响值本身与以下代码的比较:

if (val1== val2) ...

换句话说,即使 output 可能是3.14159,该值本身仍然是完整的3.141592653590(当然,要受常规浮点数的限制).

如果要执行此操作,则需要使用以下代码检查它是否足够接近而不是相等:

if ((fabs (val1 - val2) < 0.0001) ...

I want to control the precision for a double during a comparison, and then come back to default precision, with C++.

I intend to use setPrecision() to set precision. What is then syntax, if any, to set precision back to default?

I am doing something like this

std::setPrecision(math.log10(m_FTOL));

I do some stuff, and I would like to come back to default double comparison right afterwards.

I modified like this, and I still have some errors

std::streamsize prec = std::ios_base::precision();
std::setprecision(cmath::log10(m_FTOL));

with cmath false at compilation, and std::ios_base also false at compilation. Could you help?

解决方案

You can get the precision before you change it, with std::ios_base::precision and then use that to change it back later.

You can see this in action with:

#include <ios>
#include <iostream>
#include <iomanip>

int main (void) {
    double d = 3.141592653589;
    std::streamsize ss = std::cout.precision();
    std::cout << "Initial precision = " << ss << '\n';

    std::cout << "Value = " << d << '\n';

    std::cout.precision (10);
    std::cout << "Longer value = " << d << '\n';

    std::cout.precision (ss);
    std::cout << "Original value = " << d << '\n';

    std::cout << "Longer and original value = "
        << std::setprecision(10) << d << ' '
        << std::setprecision(ss) << d << '\n';

    std::cout << "Original value = " << d << '\n';

    return 0;
}

which outputs:

Initial precision = 6
Value = 3.14159
Longer value = 3.141592654
Original value = 3.14159
Longer and original value = 3.141592654 3.14159
Original value = 3.14159

The code above shows two ways of setting the precision, first by calling std::cout.precision (N) and second by using a stream manipulator std::setprecision(N).


But you need to keep in mind that the precision is for outputting values via streams, it does not directly affect comparisons of the values themselves with code like:

if (val1== val2) ...

In other words, even though the output may be 3.14159, the value itself is still the full 3.141592653590 (subject to normal floating point limitations, of course).

If you want to do that, you'll need to check if it's close enough rather than equal, with code such as:

if ((fabs (val1 - val2) < 0.0001) ...

这篇关于设置C ++中的默认浮点打印精度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆