所以我正在解决泰勒系列赛,就在这里:
这是代码:
#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 = 16
和x = 2,147,483,646
,但是如果它仍然写出正确的结果(我将程序的结果与wolfram alfa进行比较),那么long double怎么可能比2 ^ 80值更重要? )
答案 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 = 257
。 bloat
中可表示的最大值为11111111
,即21845
。所以,在这里:使用我刚刚发明的bloat
类型,我设法在8位内存中代表值21845
。 21845
大于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。