gpt4 book ai didi

c - 以 sprintf 科学记数法打印所有有效数字

转载 作者:太空狗 更新时间:2023-10-29 17:12:27 32 4
gpt4 key购买 nike

当 R 将一个大数转换为科学计数法的字符串时,它包括所有有效数字并且没有尾随零。是否可以使用 sprintf 在 C 中完成此操作?

> as.character(12345e11)
[1] "1.2345e+15"
> as.character(1234500000e6)
[1] "1.2345e+15"
> as.character(1234500001e6)
[1] "1.234500001e+15"

我试过 sprintf(buf, "%g", val) 但这似乎最多包含 5 个小数位。我还尝试使用 sprintf(buf, "%.18g", val) 设置更高的精度,但这将包括非有效数字和尾随零。

有没有办法让 sprintf(buf, "%g", val) 的行为增加 5 位限制?

最佳答案

代码可以使用"%.18e""%.18g",但问题是“18”应该有多大? 18是最好的值(value)吗?答案就在 DBL_DECIMAL_DIG 中。

DBL_DECIMAL_DIG 是要打印以确保 往返 doublestring 的最小有效数字位数> 为 all double 提供相同的double

推荐使用格式说明符"%.*e"

请注意,"%.18e" 中的“18”是小数点后 的有效位数。所以 "%.18e" 打印 19 位有效数字。


使用 printf("%a", x); 以十六进制输出。
对于十进制输出:

#include <float.h>

// sign + digit + dp + digits + e + sign + expo + \0
char buf[1 + 1 + 1 + (DBL_DECIMAL_DIG - 1) + 1 + 1 + 5 + 1];
sprintf(buf, "%.*e", DBL_DECIMAL_DIG - 1, x);

引用 Printf width specificer to maintain precision of floating-point value


y = 1.0/3.0 这样的数字使用典型的 double binary64 format 需要查看大约 53 位十进制数字才能查看其确切值。但是成功的往返不需要许多尾随数字。


现在我们知道了要打印的最多 位数字,使用下面的方法去除那些讨厌的尾随 0 位数字。

#include <float.h>
#include <math.h>
#include <stdio.h>
#include <string.h>

char *trim0(double x, char *buf) {
sprintf(buf, "% .*e", DBL_DECIMAL_DIG - 1, x);
if (isfinite(x)) {
char *p = &buf[DBL_DECIMAL_DIG + 1]; // address of last significand digit
char *t;
for (t=p; *t == '0'; t--);
memmove(t+1, p+1, strlen(p+1)+1);
}
return buf;
}

int main(void) {
char buf[1 + 1 + 1 + (DBL_DECIMAL_DIG - 1) + 1 + 1 + 5 + 1];
printf("%s\n", trim0(1.2, buf));
printf("%s\n", trim0(1.0/7, buf));
return 0;
}

输出

 1.2e+00
1.4285714285714285e-01

关于c - 以 sprintf 科学记数法打印所有有效数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26183735/

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