可以用C编程语言表示的1 /(2 ^ x)的最小精确表示是什么?

时间:2009-11-04 13:55:53

标签: c variables floating-point

可以用C编程语言表示的1 /(2 ^ x)的最小精确表示是什么?

5 个答案:

答案 0 :(得分:5)

在大多数平台上,C doubleIEEE 754 double precision format相同。支持的最接近的正值为2 ^ -1022(等于1/2 ^ 1022)。

但是,如果您允许用户定义类型,则没有限制,因为您始终可以将指数表示为bigint。

答案 1 :(得分:3)

使用IEEE-754 double进行算术运算,最小的精确值为1/2 ^ n:

  • 2 ^ -1022如果您的平台没有非正常支持
  • 2 ^ -1023如果您的平台具有非正常支持,但您坚持使用1.0 / 2 ^ n计算它;这是因为2 ^ 1023是double中两个最大可表示的精确幂。
  • 2 ^ -1074如果您的平台具有非正常支持,并且您不介意直接指定该值,例如使用C99十六进制浮点表示法:0x1.0p-10740x0.0000000000001p-1022

如果你使用另一种类型,在x86机器上说long double,并且编译器将其映射到80位浮点数,那么最小值可以小得多(2 ^ -16446,假设我做了我的算术正确=)

答案 2 :(得分:1)

如果您使用GNU MP library(用C语言编写),那么您可以表示任何高达RAM安装量的值。

答案 3 :(得分:1)

0,即1 /(2 ^ inf);)

更严重的是,这是双精度浮点数中指数位的问题。我不认为C标准本身定义了大小,但IEEE 754确实将其定义为具有11个指数位。

让我们暂时忽略非正规。由于最小指数值为-1022,因此应为1 /(2 ^ 1022)。但是那时就是非正规的情况,IIRC应该根本不包含任何隐含的1位。因此,非正规数在0..1 /(2 ^ 1022) - 范围内均匀分布,给予log2(52)更多的值IIRC。所以,我认为最终的答案应该是1 /(2 ^(1074))。

答案 4 :(得分:-1)

如果将变量存储为64位负指数,则为1/2 ^(2 ^ 63 - 1)。 :)

这是一个很小的数字。