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

标签 c

我正在从 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/

相关文章:

c - 是否可以在c中重新定义main函数

C: 如何解析 Json 请求中的值?

c - 如何在c编程中将出生日期格式作为字符串输入

c - "call by reference"和全局变量的区别

C : convert to integer using bits

c - 附加到链接列表时进行不必要的更改

c - 函数调用会跳过函数的语句

c++ - 二进制和文本模式编写的文件之间的区别

c - 生成帕斯卡三角形的最佳方法

c - 函数中的 Malloc 结构数组