gpt4 book ai didi

c - float : how many matching significant figures?

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

在 C 中,给定两个单精度或 double 浮点数,是否有一种简单的方法来确定它们有多少有效数字“匹配”? IE。如果我有两个十进制表示的这样的数字 1.642982721.64298296我想得到结果 7 .如果我关心小数位,这会很容易,但如果我对有效数字感兴趣,我不确定如何去做。

最佳答案

要进行精确比较,必须以足够的精度转换该值。 DBL_DECIMAL_DIG (典型的 17)对于 double 来说已经足够了按照 @ryyker 的建议制作唯一的字符串

为两个值形成一个字符串

//         -   d   .    digits - 1        e   -  expo \0
#define N (1 + 1 + 1 + DBL_DECIMAL_DIG + 1 + 1 + 5 + 1)
char buf[N + 10]; // Some extra too to cope with strange NaN payloads
// Consider changing round mode to "round towards 0.0. See below notes.
snprintf(buf, sizeof buf,"%+.*e", DBL_DECIMAL_DIG - 1, value);

在测试相同的符号和指数后,走前导数字。

一些示例黑客代码。
if (buf1[0] != buf2[0]) return 0; // sign test
e1 = strchr(buf1, 'e');
e2 = strchr(buf1, 'e');
if (strcmp(e1,e2)) return 0; // expo test (non-finite concerns omitted here for brevity)
digit = 0;
s1 = buf1;
s2 = buf2;
while (s1 < e1 && s2 < e2) {
if (isdigit(*s1)) {
if (*s1 == *s1) digit++;
else break;
}
s1++; s2++;
}
return digit;

如果代码尝试在没有 s*printf() 的情况下执行此操作,检查基于二进制的浮点数并转换为十进制进行比较所涉及的数学将有效地重新执行 sprintf()已经。

限制:

这个答案充其量只是一个开始。考虑 foo(0.0, 0.0)foo(DBL_TRUE_MIN, DBL_TRUE_MIN)这里会返回 DBL_DECIMAL_DIG .如 DBL_TRUE_MIN大约是 4.940656...e-324 但由于精确的十进制有大约 751 个有效数字,是否应该返回 751?

还需要研究以考虑 edge cases .

@Eric Postpischil关于首先更改舍入模式的好主意。 IAC,使用 sprintf()受执行质量的限制。

[更新]

如果 C 库按照 IEEE-754 实现 FP ,然后为了很好地处理许多情况,建议精度为 +3。
char buf[N + 3 + 10];
// Consider changing round mode to "round towards 0.0. See below notes.
snprintf(buf, sizeof buf,"%+.*e", DBL_DECIMAL_DIG + 3 - 1, value);

关于c - float : how many matching significant figures?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62325186/

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