gpt4 book ai didi

c - 使用常量空间的 fprintf

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:55 24 4
gpt4 key购买 nike

我有 fprintf 的问题。我想要的是在同一列中使用尽可能多的空间,但这意味着要更改十进制 float 的数量。我有一点问题来描述它所以也许只是例子:

0.001234
0.123456
1.234567
12.34567
123.4567

我尝试使用 g 和 f 选项,但它对我不起作用(即 %8.6g%8.6f 之类的东西)。

最佳答案

要在极端情况下生存是一个棘手的问题。

随着精度说明符的不同,小数点左边的位数会发生变化。

printf("%.3f", 9.996) --> "9.996";
printf("%.2f", 9.996) --> "10.00"; // Same print width with different precision.

给定各种舍入模式、+/- 数、NaN、INF 和 float 典型二进制表示的详细信息,尝试预测给定 float 的宽度 a printf()点数充其量只是一个近似值。与其超越思考 printf(),不如使用具有最佳猜测精度的简单 sprintf()。使用 sprintf() 返回值并根据需要调整精度。

解决方法:

  1. 估计宽度。
  2. 打印到缓冲区。
  3. 根据需要进行调整。

.

#include <float.h>
int fprintf_Width(FILE *outf, double a, int width) {
// Subtract 2 for a potential leading "0."
int prec = width - 2;
if (prec < 0 || prec > 100 /* TBD upper bound */)
return 0; // `width` out of range

// By some means, determine the approximate precision needed.
char buf[1 + 1 + DBL_MAX_10_EXP + 1 + prec + 1];
int len = sprintf(buf, "%#.*f", prec, a);
prec -= len - width;
if (prec < 0)
return 0; // `a` too big

// Try it out
len = sprintf(buf, "%#.*f", prec, a);

// Adjust as needed
if (len > width) {
prec--;
if (prec < 0)
return 0; // `a` too big
sprintf(buf, "%#.*f", prec, a);
}
len = fprintf(outf, "%s", buf);
return len;
}

关于c - 使用常量空间的 fprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21939321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com