Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C编程语言中,1/(2^x)的最小精确表示是什么?_C_Variables_Floating Point - Fatal编程技术网

在C编程语言中,1/(2^x)的最小精确表示是什么?

在C编程语言中,1/(2^x)的最小精确表示是什么?,c,variables,floating-point,C,Variables,Floating Point,在C编程语言中,1/(2^x)的最小精确表示是什么?如果将变量存储为64位负指数,则为1/2^(2^63-1)。:) 这是一个非常小的数字。在大多数平台上,C的double与。支持的最接近零的正值为2^-1022(等于1/2^-1022) 但是,如果允许用户定义类型,则没有限制,因为您始终可以将指数表示为bigint。如果使用(用C编写),则可以表示最多RAM安装量的任何值。0,即1/(2^inf);) 更严重的是,这是双精度浮点中的指数位问题。我不认为C标准本身定义了大小,但IEEE 754确

在C编程语言中,1/(2^x)的最小精确表示是什么?

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


这是一个非常小的数字。

在大多数平台上,C的
double
与。支持的最接近零的正值为2^-1022(等于1/2^-1022)

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

如果使用(用C编写),则可以表示最多RAM安装量的任何值。

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

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


让我们暂时忽略非规范化。因为最小的指数值是−1022,这应该是1/(2^1022)。但是还有非规范化的情况,IIRC不应该包含任何隐式的1位。因此,非规范数在0..1/(2^1022)-范围内均匀分布,从而使log2(52)的值IIRC增加。因此,我认为最终答案应该是1/(2^(1074))。

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

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

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

检查您的数学-64位指数应该允许降到1/(2^(2^63-1))