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

时间:2017-11-10 19:46:52

标签: c math taylor-series

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

The 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(); 
 }

问题是:如果我输入n = 16x = 2,147,483,646,但是如果它仍然写出正确的结果(我将程序的结果与wolfram alfa进行比较),那么long double怎么可能比2 ^ 80值更重要? )

3 个答案:

答案 0 :(得分:6)

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

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

sign * something * 2^something_else

这里的重要部分是2^something_else。对于32 FP号something_else(指数)是8位长,因​​为一些特殊情况意味着对于正常数字它可以−126+127,假设它是80位的长双x86 FP可以转到16383

答案 1 :(得分:4)

让我们想象一下,我决定创建自己的数据类型,我称之为bloat(如float,geddit?)。这种类型只有一个字节宽(8位)并使用以下表示:位#0(最不重要的一个)具有权重4 0 = 1,位#1具有权重4 1 = 4,位#2的重量为4 2 = 16,位#3的重量为4 3 = 64,依此类推。 / p>

00010001中的位bloat组合代表1 + 256 = 257bloat中可表示的最大值为11111111,即21845。所以,在这里:使用我刚刚发明的bloat类型,我设法在8位内存中代表值2184521845大于2 14 ,但我设法将其挤压成8位!我是如何实现这一目标的?

简单:为了&#34;伸展&#34;我的类型的明显范围我牺牲了一些中间值。例如,我的bloat类型不能代表数字2。它不能代表数字66。等等。我21845无法代表bloat下的许多值。如果您计算我的bloat 可以表示的所有可能的不同值,您会发现它们确实有256个,即正好2 8 不同值是可表示的。

浮点类型,就像你的long double采用几乎相同的原则来&#34;伸展&#34;他们的范围。它们的内部格式和属性比我的bloat更复杂,但基本思想是相同的:80位浮点类型的绝对范围远大于2 80 因为它&#34;跳过&#34; (不能代表)该范围内的许多和很多值。

其内部代表的确切详情为widely available on the Net

答案 2 :(得分:0)

x86扩展精度格式(如果这是引导你引用80位的那个)有63个尾数位和15个指数位(16383偏置,值32767保留)。

因此它可以表示的最大值非常接近2 x 2 ^(32766-16383)~1.189731 x 10 ^ 4932,远远超过2 ^ 80。

具有普通IEEE双精度的最大可表示数字约为1.79769 x 10 ^ 308。