代码之家  ›  专栏  ›  技术社区  ›  NL628

重置std::setprecision和std::fixed[重复]

  •  0
  • NL628  · 技术社区  · 6 年前

    我想在比较期间控制一个双精度,然后用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

    0 回复  |  直到 5 年前
        1
  •  35
  •   paxdiablo    7 年前

    你可以得到准确度 之前 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) ...
    
        2
  •  5
  •   Alok Save    12 年前

    您需要跟踪您当前的精度,然后在使用所需的修改精度完成操作后重新设置为相同的精度。你可以用这个 std::ios_base::precision :

    streamsize precision ( ) const;
    streamsize precision ( streamsize prec );
    

    第一种语法返回流的当前浮点精度字段的值。

        3
  •  5
  •   Ciro Santilli OurBigBook.com    4 年前

    保存整个状态 std::ios::copyfmt

    您可能还希望使用恢复以前的整个状态 std::ios::copyfmt Restore the state of std::cout after manipulating it

    主.cpp

    #include <iomanip>
    #include <iostream>
    
    int main() {
        constexpr float pi = 3.14159265359;
        constexpr float e  = 2.71828182846;
    
        // Sanity check default print.
        std::cout << "default" << std::endl;
        std::cout << pi << std::endl;
        std::cout << e  << std::endl;
        std::cout << std::endl;
    
        // Change precision format to scientific,
        // and restore default afterwards.
        std::cout << "modified" << std::endl;
        std::ios cout_state(nullptr);
        cout_state.copyfmt(std::cout);
        std::cout << std::setprecision(2);
        std::cout << std::scientific;
        std::cout << pi << std::endl;
        std::cout << e  << std::endl;
        std::cout.copyfmt(cout_state);
        std::cout << std::endl;
    
        // Check that cout state was restored.
        std::cout << "restored" << std::endl;
        std::cout << pi << std::endl;
        std::cout << e  << std::endl;
        std::cout << std::endl;
    }
    

    GitHub upstream

    编译并运行:

    g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
    ./main.out
    

    输出:

    default
    3.14159
    2.71828
    
    modified
    3.14e+00
    2.72e+00
    
    restored
    3.14159
    2.71828
    

    在Ubuntu 19.04,GCC 8.3.0上测试。

    std::format {:.2} std::setprecision

    #include <format>
    #include <string>
    
    int main() {
        std::cout << std::format("{:.2} {:.3}\n", 3.1415, 3.1415);
    }
    

    预期产量:

    3.14 3.145
    

    因此,这将彻底克服修改的疯狂 std::cout 州。

        4
  •  3
  •   premprakash    12 年前

    setprecision()只能用于输出操作,不能用于比较

    要比较float,比如a和b,必须明确地这样做:

      if( abs(a-b) < 1e-6) {   
      }
      else {
      } 
    
        5
  •  1
  •   David    6 年前

    cout << setprecision(-1)