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

nop*_*ole 0 c c++ floating-point double ieee-754

看起来JavaScript的number类型与C和C++的double类型完全相同,并且都是IEEE 754-1985

JavaScript 可以使用 IEEE 754 作为整数,但是当数字变大或进行算术计算(例如除以10或 by )时3,它似乎可以切换到浮点模式。现在,C 和 C++ 仅使用 IEEE 754 作为double,因此仅使用浮点部分,而不使用“整数”部分。因此,C 和 C++ 是否未使用整数表示形式?

(C 未使用NaN, Infinite, -Infinite,-0因为我记得在 C 中从未使用过它们)。

Eri*_*hil 8

\n

如果是这样的话,那么 IEEE 754 的[整数和一些特殊值]的表示形式是否都没有被使用,因为 C 和 C++ 没有引用它们的能力?

\n
\n

这个概念似乎源于这样一个事实:JavaScript 对所有数字使用 IEEE-754 二进制 64 格式,并通过将二进制 64 格式转换为实际运算的整数格式来执行(或至少定义)按位运算。(例如,JavaScript 中的按位 AND 是通过 ECMAScript 规范定义的,即通过将操作数转换为 32 位有符号整数而获得的位的 AND。)

\n

C 和 C++ 不使用此模型。浮点和整数类型是分开的,并且值不保存在公共容器中。C 和 C++ 根据操作数的类型计算表达式,并且对于整数和浮点运算的计算方式有所不同。如果您有某个x具有浮点值的变量,则它已被声明为浮点类型,并且它的行为方式也是如此。如果某个变量y已声明为整数类型,则它的行为与整数类型相同。

\n

C 和 C++ 没有指定使用 IEEE 754,除了 C 有一个可选附件指定了 IEEE 754 (IEC 60559) 的等效项,并且 C 和 C++ 实现可以选择使用 IEEE-754 格式并遵守它。IEEE-754 二进制 64 格式绝大多数用于doubleC 和 C++ 实现,尽管许多实现并不完全符合 IEEE-754。

\n

在binary64格式中,编码为符号位S,11位\xe2\x80\x9cexponent\xe2\x80\x9d代码E,和52位\xe2\x80\x9csignificand代码,\xe2\x80\ x9d F(对于 \xe2\x80\x9cfraction,\xe2\x80\x9d,因为有效数的 S 已被用作符号位)。表示的值为:

\n
    \n
  • 如果E为 2047 并且F不为零,则表示的值为 NaN。F的位可用于传达补充信息,而S仍然是隔离的符号位。
  • \n
  • 如果E为2047,F为0,则根据S是0还是1,表示的值为+\xe2\x88\x9e或\xe2\x88\x92\xe2\x88\x9e。
  • \n
  • 如果E既不是 0 也不是 2047,则表示的值为 (\xe2\x88\x921) S \xe2\x80\xa2(1 + F /2 52 )\xe2\x80\xa22 E \xe2\x88\x921023
  • \n
  • 如果E为零,则表示的值为 (\xe2\x88\x921) S \xe2\x80\xa2(0 + F /2 52 )\xe2\x80\xa22 1\xe2\x88\x921023。特别地,当S为1且F为0时,该值被称为\xe2\x88\x920,它等于但与+0不同。
  • \n
\n

这些表示包括从 \xe2\x88\x922 53 \xe2\x88\x921 到 +2 53 \xe2\x88\x921 (及更多)的所有整数,包括无穷大、零和 NaN。

\n

如果 adouble具有某个整数值,例如 123,那么它就具有该整数值。它不会成为int整数类型,也不被 C 或 C++ 视为整数类型。

\n
\n

但是从 (-2 53 - 1) 到 (2 53 - 1),有很多数字未使用\xe2\x80\xa6

\n
\n

binary64 格式中没有未使用的编码,但人们可能会认为大量 NaN 编码被浪费了。事实上,许多实现确实通过使程序无法访问或难以访问它们而浪费了它们。然而,IEEE-754 标准使它们可以用于用户希望使用的任何目的,并且有人使用它们来调试信息,例如记录创建 NaN 的程序计数器。

\n

  • @nonopolity:关于“我们知道它不可能这么准确”:它**可以**如此准确。根据 IEEE-754 标准的规范,除了 NaN 值之外的每个浮点值都精确地表示一个数字。在浮点运算中,是运算逼近实数,而不是数字逼近实数。每个运算产生的结果近似(或精确)对应的实数算术产生的结果,但每个浮点恰好是一个实数。 (3认同)