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进行比较)
假设您正在谈论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:
让我们想象一下,我决定发明自己的数据类型,我会称之为bloat(如floatgeddit?)。这种类型只有一个字节宽(8位),并使用以下表示形式:位#0(最低有效位)的权重为4 0 = 1,位#1的权重为4 1 = 4,位#2的权重为4 4 2 = 16,位#3的权重为4 3 = 64,依此类推。
位的组合00010001在bloat将代表1 + 256 = 257。表示的最大值的bloat是11111111,这是21845。因此,这里是:使用我刚发明的bloat类型,我设法21845仅用8位内存来表示值。21845大于2 14,但我还是设法将其压缩为8位!我是如何实现的?
容易:为了“伸展”我的类型的明显范围,我牺牲了一些中间值。例如,我的bloat类型不能代表数字2。它不能代表数字66。等等。21845我bloat无法代表许多价值观。如果算出我bloat 可以代表的所有可能的不同值,您会发现它们确实存在256,即恰好可以表示2 8个不同的值。
像您这样的浮点类型long double使用几乎相同的原理来“扩展”它们的范围。它们的内部格式和属性比我的内部格式和属性要复杂得多bloat,但是其基本思想是相同的:80位浮点类型的绝对范围比2 80大得多,因为它“跳过”(无法表示)很多以及该范围内的许多值。
其内部表示的确切详细信息可在网上广泛获得。