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

时间:2010-06-15 19:03:56

标签: c++

我想知道,使用fprintf打印的双倍长度的字符数是多少?我猜错了。

提前致谢。

5 个答案:

答案 0 :(得分:8)

十二个人会有点低估。在我的机器上,以下结果是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个字符长的字符串。

答案 1 :(得分:6)

谁知道呢。标准没有说明double提供的精度数字除了说它(3.9.1.8)“提供至少与浮点数一样多的精度之外”,所以你并不真正知道 sprintf任意值需要多少个字符。即使您确实知道实现提供了多少位数,仍然存在指数格式等问题。

但这里有一个更大的问题。为什么你会关心?我猜这是因为你试图写这样的东西:

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

这是一种不好的方法,正是因为你不知道MAGIC_NUMBER应该有多大。你可以挑选一些足够大的东西,比如14或128k,但是你选择的数字是任意的,不是基于猜测以外的任何东西都足够大。像MAGIC_NUMBER这样的数字并不令人惊讶,称为Magic Numbers。远离他们。他们会让你有一天哭。

相反,有很多方法可以进行这种字符串格式化,而不必关心缓冲区大小,精度数字等等,这些让你可以继续编程。 Streams是一个:

#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 :(得分:2)

其定义为限制:

 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/

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

答案 3 :(得分:0)

你可以自己决定..

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

./ a.out的
  1.111111111111111

你可以打印超过12个字符..

答案 4 :(得分:0)

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

请参阅Double precision floating-point format进行简短讨论。

对于更深入的研究,规范性论文是What Every Computer Scientist Should Know About Floating-Point Arithmetic。每当二进制浮点讨论弹出时,它就会被引用,并值得周末仔细阅读。