什么时候浮点正零不是全位零?

When is the floating-point positive zero not all-bit zero?

提问人:GKxx 提问时间:10/15/2023 最后编辑:GKxx 更新时间:10/16/2023 访问量:70

问:

在 C 语言中,空初始化将浮点变量初始化为正零。它说

(在空指针值和浮点零具有全位零表示形式的平台上,这种形式的静态初始化通常是通过在程序映像的 .bss 部分中分配它们来实现的)

那么,使正零不是全位零的实际平台或浮点格式是什么?

c 浮点

评论

3赞 dbush 10/15/2023
IEEE754浮点表示将正 0 实现为全位零,您可能遇到的大多数系统都使用它,因此您需要找到一个不使用该表示的系统。
1赞 John Bollinger 10/15/2023
曾几何时,浮点表示形式因供应商而异,但现在差别很大。如果你对正零不是全位零的历史 FP 格式感兴趣,那么 Retrocomputing SE 可能是一个更好的问题。并不是说我不确定现实中曾经有过这样的格式,但 C 语言规范允许它们。
1赞 Daniel Earwicker 10/15/2023
这回答了你的问题吗?是否有任何具有非 IEEE C/C++ 浮点格式的现代平台?
0赞 Lundin 10/16/2023
C23 尚未发布,因此 C 仍然无效。= {}

答:

1赞 chux - Reinstate Monica 10/16/2023 #1

什么时候浮点正零不是全位零?

在 OP 的问题中有一个隐藏的假设,即只有 1 个浮点正零编码。

在 201x 之前,CCS 是嵌入式目标的良好编译器。它使用了一个非IEEE浮点数

第 1 字节:8 位偏置指数 第
2 字节:符号位和 7 MS 数位 第
3 字节:尾数多 8 位
第 4 字节:8 LS 尾数

它不支持次正态。任何 00-XX-XX-XX 都是“零”。

类似的代码将使用全零位模式生成正零。float x = 0.0;x

uint32_t y = 0x001122; memcpy(&x, &y, 4);将使用非零位模式生成正零。x


一个更狭隘的问题如下,它更好地解决了OP的担忧。

什么时候浮点初始化为正零而不是全位零?