gpt4 book ai didi

c - 这个数字是否有超过 D 位小数?

转载 作者:行者123 更新时间:2023-12-01 13:04:57 25 4
gpt4 key购买 nike

假设我想编写一个执行以下操作的函数:

Given a number N,
when N is rounded to D1 digits
does the result include more than D2 decimal places, not counting trailing zeroes?

例如,假设 N 是 .01001,D1 是 4,D2 是 2。问题就变成了,.0100 是否包含超过 2 位小数,不包括尾随零?答案是“不”。但如果 N 为 .00101,则答案为"is"。

考虑到 float 的限制,我正在寻找一种使用标准 C 库函数执行此操作的有效方法。

我的预期用法示例:必要时使用四位数显示数字,否则使用两位数显示。

(这不是家庭作业题——这是作为一名专业程序员的结果,他在学生时代没有做过这类家庭作业题。)

最佳答案

用标准库做到这一点的唯一简单方法是使用具有正确格式的snprintf(或只是sprintf),然后自己计算零。正确计算(二进制) float 的十进制表示是一项非常非常困难的任务,您不想自己尝试,并且编写比标准库更快的正确版本的机会几乎为零.

希望我做对了;它未经测试:

double n; /* the number N */
int d1, d2; /* the parameters d1 and d2 */
char s[MAXLEN], *z;
snprintf(s, sizeof s, "%.*f", d1, n);
for (z=s+strlen(s)-1; *z==0; z--);
if (strlen(++z)<d1-d2) puts("yes");
else puts("no");

编辑:正如 ssianky 所指出的,snprintf 可能对其打印精度有限制。实际上,C 标准允许几乎所有浮点运算无缘无故地给出错误结果,只要实现文档本身就是这样,但鼓励 IEEE 行为,并且 POSIX 还要求正确地将结果舍入到 DECIMAL_DIG 地方,但允许实现在打印足够多的地方以唯一确定实际浮点值后打印废话(例如全零)。因此,长话短说,如果 d1 相当大,或者如果您的平台是病态的,基于 snprintf 的方法可能无法给出正确的答案。 (实际上,他们会在 GNU 系统上给出正确答案,而在 Microsoft 系统上给出错误答案。)

如果您关心这个缺点并希望为任何d1 值得到正确的结果,您将不得不implement exact float-to-decimal code yourself .涉及将浮点值重复乘以 10 的循环无法满足此要求。

编辑 2: 查看 OP 的“预期用途”,使用 snprintf 似乎是一个明智的选择。如果您想要打印开始的值并且只是想决定使用多少小数位,只需将它打印成一个字符串,然后在显示它之前切掉尾随的零。事实上,%g printf 格式说明符甚至可能已经完成了 OP 想要的...

关于c - 这个数字是否有超过 D 位小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3765372/

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