gpt4 book ai didi

c - 当不能接受精度损失时,是否有合理的理由使用 double 来存储整数?

转载 作者:太空狗 更新时间:2023-10-29 16:11:06 26 4
gpt4 key购买 nike

我正在从 K&R(第二版)学习 C,并且对本书早期的示例之一感到困惑。在 1.5.2 节中,本书首先展示了一个字符计数程序,如下所示:

#include <stdio.h>

/* count characters in input; 1st version */
main()
{
long nc;

nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}

然后备注:

It may be possible to cope with even bigger numbers by using a double

并展示该程序的替代版本:

#include <stdio.h>

/* count characters in input; 2nd version */
main()
{
double nc;

for (nc = 0; getchar() != EOF; ++nc)
;
printf("%.0f\n", nc);
}

在这里使用double 有意义吗?似乎没有; long long 肯定会更好,因为它可以在相同的空间中存储比 double jar 更大的整数(不损失精度),并且通过在声明时传达变量是整数来提高可读性。

是否有我遗漏的使用 double 的理由,或者 K&R 示例只是为了演示 double 类型而硬塞进的普通错误代码?

最佳答案

doublelong

Is there any rational reason to use a double to store an integer when precision loss isn't acceptable? [...] Does using a double here make any sense?

即使在 C2011 中,键入 long可能只有 31 个值位,因此它的可表示值范围可能小到从 -231 到 231 - 1(假设二进制补码表示;略更窄的符号/幅度表示)。

C 没有指定浮点值表示的细节,但 IEEE-754 表示如今已近乎通用。 C double s 几乎总是以 IEEE-754 二进制 double 格式表示,它提供 53 位尾数。该格式可以精确表示从-(253 - 1)到253 - 1的所有整数,如果按照IEEE 规范以及数学结果和所有中间值是否是可精确表示的整数(有时甚至不是)。

所以使用 double而不是 long确实可以在不牺牲精度的情况下产生更大的数值范围。

doublelong long

surely a long long would be superior [...]

long long具有比 double 更大范围的(精确)可表示整数值,因此没有理由更喜欢 doublelong long对于整数,如果后者可用。然而,正如评论中所观察到的,long long 1978年K&R第一版出版时还没有,1988年第二版出版时也远未达到标准。因此,long long不在 Kernighan 和 Ritchie 考虑的备选方案之列。事实上,虽然许多 C90 编译器最终支持它作为扩展,long long直到 C99 才标准化。

无论如何,我倾向于认为让您感到困惑的言论并不是对使用 double 的认可。为此,作为关于 double 比较范围的边栏评论.

关于c - 当不能接受精度损失时,是否有合理的理由使用 double 来存储整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503160/

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