gpt4 book ai didi

c - 是否有任何(有效的)C 实现其中 float 不能表示值 0?

转载 作者:太空狗 更新时间:2023-10-29 14:54:01 26 4
gpt4 key购买 nike

如果所有 float 都表示为 x = (-1)^s * 2^e * 1.m ,则在不支持特殊情况的情况下无法存储零。

最佳答案

不,所有符合标准的 C 实现都必须支持 0.0 的浮点值。

浮点模型在 C standard 的第 5.2.4.2.2 节中进行了描述。 (链接是最近的草稿)。该模型不会使有效数字(有时称为尾数)中的前导 1 隐含,因此表示 0.0 没有问题。

大多数二进制 float 的实现不存储前导 1,事实上您在问题中引用的公式:

x = (-1)^s * 2^e * 1.m

通常是正确的(尽管 e 的存储方式可能不同)。

在这样的实现中,包括 IEEE,一种特殊情况的位模式,通常是全零位,用于表示 0.0

在评论中的讨论之后,tmyklebu 认为并非所有由 5.2.4.2.2 中的浮点模型定义的数字都必须是可表示的。我不同意;如果不是所有这些数字都需要可表示,那么该模型几乎毫无用处。但即使撇开这个论点,也有一个明确的要求,即 0.0 必须是可表示的。 N1570 6.7.9 第 10 段:

If an object that has static or thread storage duration is not initialized explicitly, then:

  • ...
  • if it has arithmetic type, it is initialized to (positive or unsigned) zero;
  • ...

这是一项由来已久的要求。 C reference from 1975 (K&R1 出版前 3 年)说:

The initial value of any externally-defined object not explicitly initialized is guaranteed to be 0.

这意味着必须有一个可表示的 0 值。 K&R1(1978 年出版)在第 198 页说:

Static and external variables which are not initialized are guaranteed to start off as 0; automatic and register variables which are not initialized are guaranteed to start off as garbage.

有趣的是,1990 年的 ISO C 标准(等同于 1989 年的 ANSI C 标准)与其前身和后继者相比略微不够明确。在 6.5.7 中,它说:

If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every member that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant.

如果不需要一个浮点类型来精确表示 0.0,那么“赋值 0”短语将暗示从 int0 到浮点类型,产生一个小值接近 0.0。尽管如此,C90 具有与 C99 和 C11 相同的浮点模型(但没有提及次正规或非正规化值),并且我上面关于模型编号的论点仍然适用。此外,C90 标准被 C99 正式取代,C99 又被 C11 取代。

关于c - 是否有任何(有效的)C 实现其中 float 不能表示值 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26597278/

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