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

C++中打印双份的最大宽度

c++
  •  4
  • Cenoc  · 技术社区  · 15 年前

    我在想,用fprintf打印的双面打印最长的字符数是多少?我猜错了。

    提前谢谢。

    5 回复  |  直到 15 年前
        1
  •  6
  •   John Dibling    15 年前

    谁知道呢。标准并没有说一个数字的精度是多少 double 知道 sprintf 任意值。即使您知道您的实现提供了多少位数,仍然存在指数格式等问题。

    但这里有一个更大的问题。你为什么会在乎?我猜是因为你想写这样的东西:

    double d = ...;
    int MAGIC_NUMBER = ...;
    char buffer[MAGIC_NUMBER];
    sprintf(buffer, "%f", d);
    

    这是一个不好的方法,因为你不知道有多大 MAGIC_NUMBER 应该是。你可以选择一个足够大的数字,比如14或128k,但是你选择的数字是任意的,不是基于任何东西而是一个数字 猜测 幻数 被称为 Magic Numbers

    相反,有很多方法可以实现这种字符串格式化,而不必关心缓冲区大小、精度数字等,这样您就可以继续进行编程了。溪流是一种:

    #include <sstream>
    
    double d = ...;
    stringstream ss;
    ss << d;
    string s = ss.str();
    cout << s;
    

    ... Boost.Format 是另一个:

    #include <boost\format\format.hpp>
    
    double d = ... ;
    string s = (boost::format("%1%") % d).str();
    cout << s;
    
        2
  •  8
  •   James McNellis    15 年前

    12岁就有点低估了。在我的机器上,以下结果将产生317个字符长的字符串:

    #include <limits>
    #include <cstdio>
    #include <cstring>
    
    int main() 
    {
        double d = -std::numeric_limits<double>::max();
        char str[2048] = "";
    
        std::sprintf(str, "%f", d);
    
        std::size_t length = std::strlen(str);
    }
    

    使用 %e 结果是一个14个字符长的字符串。

        3
  •  2
  •   Don Wakefield    15 年前

    其定义如下:

     std::cout << std::numeric_limits<double>::digits << "\n";
     std::cout << std::numeric_limits<double>::digits10 << "\n";
    

    定义:

    digits:    number of digits (in radix base) in the mantissa
               Equivalent to FLT_MANT_DIG, DBL_MANT_DIG or LDBL_MANT_DIG.
    digits10:  Number of digits (in decimal base) that can be represented without change.
               Equivalent to FLT_DIG, DBL_DIG or LDBL_DIG for floating types.
    

    请参见: http://www.cplusplus.com/reference/std/limits/numeric_limits/

    当然,当您将内容打印到流时,可以使用流操纵器来限制输出的大小。

        4
  •  0
  •   Yacoby    15 年前

    double a=1.1111111111111111111111111111111111111111111111111;
    printf("%1.15lf\n", a);  
    return 0;
    

    a.出局
    1.111111111111111

    您可以打印超过12个字符。。

        5
  •  0
  •   Don Wakefield    15 年前

    如果您的机器使用IEEE754双倍(现在相当普遍),那么二进制精度是53位;十进制等效值约为15.95(通过对数转换计算),因此通常可以依赖15位十进制数字的精度。

    咨询 Double precision floating-point format 进行简短的讨论。

    为了更深入的研究,规范论文是 What Every Computer Scientist Should Know About Floating-Point Arithmetic