如果所有浮点数都表示为x = (-1)^s * 2^e * 1.m,那么如果不支持特殊情况,就无法存储零。
发布于 2014-10-27 21:44:01
不,所有符合C的实现都必须支持0.0的浮点值.
浮点模型在C标准的5.2.4.2.2节中进行了描述(链接到最近的草案)。该模型没有使重要意义中的领先1 (有时称为尾数)隐式化,因此它没有表示0.0的问题。
二进制浮点的大多数实现都不存储领先的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段:
如果具有静态或线程存储持续时间的对象未显式初始化,则:
这是一个非常长期的要求。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”短语将意味着从int值0到浮点类型的转换,从而产生一个接近0.0的小值。尽管如此,C90与C99和C11有相同的浮点模型(但没有提到低于正常值或非规范化值),我上面关于模型数字的论点仍然适用。此外,C90标准被C99正式取代,而后者又被C11所取代。
发布于 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中是可选的,因此这个论点毫无意义。
发布于 2014-10-28 02:52:40
我相信以下浮点系统是一个没有零表示的协调浮点算法的例子:
一个float是一个48位数,它有一个符号位,15个指数位,32个点位.符号位、指数位和有效位的每一个选择都对应于一个具有隐含前导1位的普通浮点数。
通过草案C标准基思汤普森连接第5.2.4.2.2节中的约束
-0x1.ffffffffp+16383到0x1.ffffffffp+16383。+、-、*、/和数学库具有实现定义的准确性.还是没问题。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_MAX,FLT_EPSILON,FLT_MIN和FLT_TRUE_MIN。https://stackoverflow.com/questions/26597278
复制相似问题