无法理解长双数如何大于2 ^ 80

Elv*_*vin -1 c math taylor-series

所以我正在解决泰勒系列,它在这里:

泰勒系列

这是代码:

#define _CRT_SECURE_NO_WARNINGS 
#include<conio.h>  
#include<stdio.h>  
#include<math.h>  
long double Fact(long double h) { 
if (h <= 0) return 1; 
else return h*Fact(h - 1); 
 } 

void main(void) { 
int p = 0; 
long double s = 0, k = 0, c = 0, l = 0,d=0; 
int n = 0, x = 0; 
printf(" n "); 
scanf("%d", &n);  
printf(" x "); 
scanf("%d", &x); 
d = x; 
while (n>=0) { 
  k = pow(-1, n); 
  c = (2 * n + 1); 
  l = Fact(c); 
  d = pow(x, 2 * n + 1);  
  s = s+ ((k / l)*d); 
  n = n - 1; 
   } 
printf("Result : %.16LG\n", s); 
_getch(); 
 }
Run Code Online (Sandbox Code Playgroud)

问题是:如果我进入n = 16并且x = 2,147,483,646 它仍然写出正确的结果,那么如果长的双倍可以比2 ^ 80值更重要(我将程序的结果与wolfram alfa进行比较)

NoS*_*tAl 6

假设您正在谈论2 ^ 80,因为您假设大小为80位的浮点数可以存储最多2 80的数字.您对浮点数的理解是错误的.与编号为二进制数的无符号整数不同,浮点数的编码不同.

您可以在维基百科上了解更多信息,但基本思路是将浮点数编码为

sign * something * 2^something_else
Run Code Online (Sandbox Code Playgroud)

这里重要的部分是 2^something_else.对于32 FP数目something_else(指数)为8位长,因为一些特殊情况下意味着,对于正常数目它可以去?126+127,长期双假定它80位x86 FP它可以到16383:

  • @NoSenseEtAl太好了。我已经清除了我的评论。 (2认同)

AnT*_*AnT 5

让我们想象一下,我决定发明自己的数据类型,我会称之为bloat(如floatgeddit?)。这种类型只有一个字节宽(8位),并使用以下表示形式:位#0(最低有效位)的权重为4 0 = 1,位#1的权重为4 1 = 4,位#2的权重为4 4 2 = 16,位#3的权重为4 3 = 64,依此类推。

位的组合00010001bloat将代表1 + 256 = 257。表示的最大值的bloat11111111,这是21845。因此,这里是:使用我刚发明的bloat类型,我设法21845仅用8位内存来表示值。21845大于2 14,但我还是设法将其压缩为8位!我是如何实现的?

容易:为了“伸展”我的类型的明显范围,我牺牲了一些中间值。例如,我的bloat类型不能代表数字2。它不能代表数字66。等等。21845bloat无法代表许多价值观。如果算出我bloat 可以代表的所有可能的不同值,您会发现它们确实存在256,即恰好可以表示2 8个不同的值。

像您这样的浮点类型long double使用几乎相同的原理来“扩展”它们的范围。它们的内部格式和属性比我的内部格式和属性要复杂得多bloat,但是其基本思想是相同的:80位浮点类型的绝对范围比2 80大得多,因为它“跳过”(无法表示)很多以及该范围内的许多值。

其内部表示的确切详细信息可在网上广泛获得