首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有浮点数不能表示值0的(有效)C实现?

是否有浮点数不能表示值0的(有效)C实现?
EN

Stack Overflow用户
提问于 2014-10-27 21:36:06
回答 3查看 166关注 0票数 5

如果所有浮点数都表示为x = (-1)^s * 2^e * 1.m,那么如果不支持特殊情况,就无法存储零。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-27 21:44:01

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

浮点模型在C标准的5.2.4.2.2节中进行了描述(链接到最近的草案)。该模型没有使重要意义中的领先1 (有时称为尾数)隐式化,因此它没有表示0.0的问题。

二进制浮点的大多数实现都不存储领先的1,实际上您在问题中引用的公式是:

代码语言:javascript
运行
复制
x = (-1)^s * 2^e * 1.m

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

在这样的实现中,包括IEEE,一个特殊的位模式,通常是全位零,用来表示0.0.

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

如果具有静态或线程存储持续时间的对象未显式初始化,则:

  • ..。
  • 如果它有算术类型,则初始化为(正或无符号)零;
  • ..。

这是一个非常长期的要求。C从1975年起参考 (K&R1出版前3年)说:

未显式初始化的任何外部定义对象的初始值保证为0。

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

未初始化的静态和外部变量保证从0开始;未初始化的自动变量和寄存器变量保证作为垃圾启动。

有趣的是,1990年的ISO C标准(相当于1989年的ANSI C标准)比其前身和继承者稍微不那么明确。在6.5.7中,它规定:

如果没有显式初始化具有静态存储持续时间的对象,就会隐式地初始化它,就好像每个具有算术类型的成员都被分配为0,而每个具有指针类型的成员都被分配了一个空指针常量。

如果浮点类型不需要对0.0有准确的表示,那么“赋值0”短语将意味着从int0到浮点类型的转换,从而产生一个接近0.0的小值。尽管如此,C90与C99和C11有相同的浮点模型(但没有提到低于正常值或非规范化值),我上面关于模型数字的论点仍然适用。此外,C90标准被C99正式取代,而后者又被C11所取代。

票数 8
EN

Stack Overflow用户

发布于 2014-10-28 12:22:42

经过一段时间的搜索,发现了这个。

ISO/IEC 9899:201x第6.2.5节,第13段

每种复类型都具有与数组类型相同的表示和对齐要求,数组类型恰好包含对应实类型的两个元素;第一个元素等于复数的实部,第二个元素对应于虚部。

第6.3.1.7节,第1款

当实型值转换为复类型时,复结果值的实部由转换为相应实型的规则确定,复结果值的虚部为正零或无符号零。

因此,如果我理解正确,任何支持C99 (带有_Complex类型的第一个C标准)的实现都必须支持浮点值为0.0。

EDIT Keith指出,复杂类型在C99中是可选的,因此这个论点毫无意义。

票数 2
EN

Stack Overflow用户

发布于 2014-10-28 02:52:40

我相信以下浮点系统是一个没有零表示的协调浮点算法的例子:

一个float是一个48位数,它有一个符号位,15个指数位,32个点位.符号位、指数位和有效位的每一个选择都对应于一个具有隐含前导1位的普通浮点数。

通过草案C标准基思汤普森连接第5.2.4.2.2节中的约束

  • 这种浮点数制度显然符合标准草案5.2.4.2.2第1和第2款的规定。
  • 我们只代表正常化的数字;第3段只允许我们走得更远。
  • 第4段很棘手,它说零和“不是浮点数的值”可能是有符号的或无符号的。但是第三段并没有强迫我们有任何没有浮点数的值,所以我无法想象把第四段解释为要求有一个零。
  • 第5段中的可表示值的范围显然是从-0x1.ffffffffp+163830x1.ffffffffp+16383
  • 第6段指出,+-*/和数学库具有实现定义的准确性.还是没问题。
  • 只要我们能够为所有常量找到适当的值,第7段就不会真正限制这个实现。
  • 我们可以将FLT_ROUNDS设置为0;这样,我甚至不必指定加减溢出时会发生什么。
  • FLT_EVAL_METHOD应为0。
  • 我们没有异常值,所以FLT_HAS_SUBNORM应该是零。
  • FLT_RADIX为2,FLT_MANT_DIG为32,FLT_DECIMAL_DIG为10,FLT_DIG为9,FLT_MIN_EXP为-16383,FLT_MIN_10_EXP为- 4933,FLT_MAX_EXP为16384,FLT_MAX_10_EXP为4933。
  • 你可以算出FLT_MAXFLT_EPSILONFLT_MINFLT_TRUE_MIN
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26597278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档