在 C 中设置默认浮点打印精度

新手上路,请多包涵

我想在比较期间控制双精度,然后使用 C++ 回到默认精度。

我打算使用 setPrecision() 来设置精度。那么将精度设置回默认值的语法(如果有)是什么?

我正在做这样的事情

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

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

我是这样修改的,还是有一些错误

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

cmath 在编译时为假,而 std::ios_base 在编译时也是假的。你能帮忙吗?

原文由 kiriloff 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

您可以在更改 之前 获得精度,使用 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) ...

换句话说,即使 输出 可能是 3.14159 ,该值本身仍然是完整的 3.141592653590 (当然要受到正常的浮点限制)。

如果你想这样做,你需要检查它是否足够接近而不是相等,代码如下:

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

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 cout << setprecision(-1)

原文由 David 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题