当前位置: 首页 > 知识库问答 >
问题:

max_digits10的目的是什么,它与数字10有何不同?

谭嘉容
2023-03-14

我对max_digits10代表什么感到困惑。根据它的留档,所有整数类型都是0。max_digits10的浮点类型公式看起来类似于intdigits10的。

共有2个答案

宿嘉
2023-03-14

在我看来,它在链接的网站(以及数字10的网站)上得到了充分的解释:

digits10是(最大值。)十进制数字的数量,其中数字< br >在任何情况下都可以用类型来表示,与它们的实际值无关。< br >以一个常见的4字节无符号整数为例:众所周知,它正好有32位,< br >也就是32位二进制数。< br >但是就十进制数字而言呢?< br >可能是9。< br >因为,它既可以存储100000000,也可以存储99999999。< br >但是如果取10位数字:4000000000可以存储,500000000不可以。< br >因此,如果我们需要保证最小十进制数字容量,它就是9。< br >这就是digits10的成果。

max_digits10只对float/double感兴趣…并给出了我们需要输出/保存/处理的十进制数字计数
…以获得浮点类型可以提供的整体精度理论示例:一个内容为123.112233445566的变量
如果您向用户显示123.1122334455660000000,这是没有意义的,因为
您可以省略后面的零(因为您的变量无论如何都不能容纳那么多)
因此,max_digits10表示您在一个类型中可以使用的位数精度。

闻人飞白
2023-03-14

简单地说,

    < li> digits10是保证在文本→浮点→文本往返中保留的十进制位数。 < li> max_digits10是保证正确浮点→文本→浮点往返所需的十进制位数。

两者都有例外,但这些值提供了最低保证。请阅读< code>max_digits10上的原始提案,了解清晰的示例、W. Kahan教授的话以及更多详情。大多数C实现遵循IEEE 754的浮点数据类型。对于IEEE 754 float,digits10是< code>6,max_digits10是< code > 9 ;对于< code>double,它是< code>15和< code>17。请注意,这两个数字不应与浮点数的实际十进制精度相混淆。

char const *s1 = "8.589973e9";
char const *s2 = "0.100000001490116119384765625";
float const f1 = strtof(s1, nullptr);
float const f2 = strtof(s2, nullptr);
std::cout << "'" << s1 << "'" << '\t' << std::scientific << f1 << '\n';
std::cout << "'" << s2 << "'" << '\t' << std::fixed << std::setprecision(27) << f2 << '\n';

指纹

'8.589973e9'      8.589974e+009
'0.100000001490116119384765625'   0.100000001490116119384765625

直到6th有效数字的所有数字都被保留,而7th数字在第一个数字中没有存活。然而,第二组的27个手指全部存活;这是一个例外。然而,大多数数字在超过7位数后会有所不同,所有数字在6位数内都会相同。

总之,digits10给出了在给定浮点数中可以计数的有效位数,因为它与创建它的十进制形式的原始实数相同,即转换为浮点数后幸存的位数。

void f_s_f(float &f, int p) {
    std::ostringstream oss;
    oss << std::fixed << std::setprecision(p) << f;
    f = strtof(oss.str().c_str(), nullptr);
}

float f3 = 3.145900f;
float f4 = std::nextafter(f3, 3.2f);
std::cout << std::hexfloat << std::showbase << f3 << '\t' << f4 << '\n';
f_s_f(f3, std::numeric_limits<float>::max_digits10);
f_s_f(f4, std::numeric_limits<float>::max_digits10);
std::cout << f3 << '\t' << f4 << '\n';
f_s_f(f3, 6);
f_s_f(f4, 6);
std::cout << f3 << '\t' << f4 << '\n';

指纹

0x1.92acdap+1   0x1.92acdcp+1
0x1.92acdap+1   0x1.92acdcp+1
0x1.92acdap+1   0x1.92acdap+1

这里有两个不同的floats,当用max_digits10精度数字打印时,它们给出不同的字符串,当读回这些字符串时,它们将返回原来的 s。当打印精度较低时,由于四舍五入,它们提供相同的输出,因此当读回时会导致相同的 float,而实际上它们来自不同的值。

总之,至少需要max_digits10消除两个十进制浮点数的歧义,以便在转换回二进制浮点数时,我们再次获得原始位,而不是由于舍入错误而稍早或稍晚的位。

 类似资料:
  • 问题内容: 直到几天前,我才听说过野车,在读完我的老师的Java书籍后,我仍然不确定它的用途以及为什么需要使用它。 比方说,我有一个超类和几个子类都,,,等…现在我需要有动物名单,我首先想到的会是这样的: 相反,我的同事们建议采取以下措施: 为什么要使用通配符而不是简单的泛型? 假设我需要一个get / set方法,应该使用前一种还是后一种?它们有何不同? 问题答案: 声明局部变量时,通配符没有多

  • 问题内容: 我们知道根目录是/,根据posix,还有另一个目录//与/不同。当使用ls /和ls //时,输出与stat相同,但是,如果cd /和cd //则输出不同,尽管目录内容相同。那真的让我感到困惑。有人得到答案了吗? 问题答案: 从Bash常见问题解答:

  • 我刚刚开始使用MongoDB,我注意到它使用BSON在内部存储数据。然而,关于什么是BSON以及如何在MongoDB中使用BSON,文档并不十分清楚。有人能给我解释一下吗?

  • 使用PEP 557,将数据类引入python标准库。 它们使用了装饰器,它们应该是“带默认值的可变名称耦合”,但我不太清楚这到底意味着什么,以及它们与普通类的区别。 python数据类到底是什么?什么时候最好使用它们?

  • 问题内容: 我只是通过使用PyMySQL而不是MySQLdb解决了Django 现在,我想知道PyMySQL到底是什么以及它与MySQLdb有何不同。 我在本地主机上使用它,然后将其上传到某些主机。 在本地主机上使用PyMySQL并托管它们提供的任何内容都可以吗?由于我已将base.py和introspection.py中的“ MySQLdb”更改为“ PyMySQL”,更改这些文件后是否需要将其

  • 数据结构中的堆栈是什么?在队列上使用堆栈的重要性是什么?我用C语言创建了stack,但无法理解它的原理和优点。