如果C和C++的double(和float)是IEEE 754-1985,那么整数表示和Infinity、-0、NaN等是否都没有使用?

qlfbtfca  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(112)

看起来JavaScript's number typeC and C++'s double type完全相同,并且两者都是IEEE 754-1985
JavaScript可以使用IEEE 754作为整数,但当数字变大或进行算术计算(如除以103)时,它似乎可以切换到浮点模式。现在C和C只使用IEEE 754作为double,因此只使用浮点部分,而不使用“整数”部分。因此,C和C没有使用整数表示法吗?
(and C没有使用NaNInfinite-Infinite-0,因为我记得在C中从未使用过它们)。

rjee0c15

rjee0c151#

如果是这样的话,IEEE 754中[整数和一些特殊值]的表示形式是否都没有使用,因为C和C没有引用它们的能力?
这个概念看起来好像是源于JavaScript对所有数字都使用IEEE-754 binary 64格式,并执行通过将二进制64格式转换成整数格式以用于实际操作来进行(或至少定义)逐位操作。(例如,JavaScript中的按位AND是通过ECMAScript规范定义的,作为通过将操作数转换为32位有符号整数而获得的位的AND。)
C和C
不使用此模型。浮点和整数类型是分开的,并且值不保存在公共容器中。C和C基于操作数的类型计算表达式,并且对于整数和浮点运算的计算方式不同。如果您有某个具有浮点值的变量x,则它已被声明为浮点类型。它的行为是这样的,如果变量y声明为整型,它的行为也是整型.
C和C
没有指定使用IEEE 754,只是C有一个可选附件指定了IEEE 754的等效项(IEC 60559),并且C和C实现可以选择符合使用IEEE-754格式并且符合它。IEEE-754二进制64格式被C和C实现压倒性地用于double,尽管许多在它们的实现中不完全符合IEEE-754。
在二进制64格式中,编码为符号位 S、11位“指数”代码 E 和52位“有效数代码”F(表示“分数”,因为S表示有效数,已用于符号位)。表示的值为:

  • 如果 E 为2047且 F 不为零,则所表示的值为NaN。F 的位可用以传达补充信息,且 S 保持为孤立符号位。
  • 如果 E 是2047,而 F 是零,则根据 S 是0还是1,所表示的值是+∞或−∞。
  • 如果 E 既不是0也不是2047,则表示的值为(−1)S·(1 + F/252)·2E−1023。
  • 如果 E 为零,则表示的值为(−1)S·(0 + F/252)·21−1023。特别地,当 S 为1且 F 为0时,该值被称为−0,它等于但不同于+0。

这些表示包括从-253 -1到+253 1(以及更多)的所有整数,都是无穷大,都是零,还有NaN。
如果一个double有一个整数值,比如123,那么它只是有这个整数值,它不会变成一个int,也不会被C或C++当作整数类型。
但是从(-253 -1)到(253 -1),有很多数字没有使用......
在binary 64格式中没有未使用的编码,除了人们可能认为大量的NaN编码被浪费了。事实上,许多实现确实浪费了它们,使它们无法访问或难以被程序访问。然而,IEEE-754标准使它们可用于任何用户可能希望将它们用于的目的,并且有人将它们用于调试信息,例如记录创建NaN的程序计数器。

hk8txs48

hk8txs482#

int的数字123double的数字123.0完全相同,通过测试123 == 123.0可以很容易地看出这一点,但是它们的表示在内部是不同的。

相关问题