我想知道,使用fprintf打印的双倍长度的字符数是多少?我猜错了。
提前致谢。
答案 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。每当二进制浮点讨论弹出时,它就会被引用,并值得周末仔细阅读。