晚安,我在Embarcadero 10.2上的writeln遇到问题,我试图将sin()函数编写为泰勒展开式无限系列。
一切正常,但是输出的科学表达式为:3.60448486921676E-0158,正确的是0.912945250727627654376099983845。
我需要30位精度。我下面的代码是一个控制台程序。
%ed deleted_function
答案 0 :(得分:2)
要执行非常长的精度计算,您需要一些用于任意精度算术的库-使用GMP的Delphi包装器/接口或某些Delphi库。 Example。 Another one。
请注意,对于仅支持长整数(不支持浮点数)的库,您仍可以像此Python代码那样计算序列(它内部支持大整数。**
是幂,//
是{{ 1}})。
唯一的除法(慢速操作)执行一次。
div
方法基于此:
d30 = 10**30
d60 = d30 * d30
x = 3141592653589793238462643383279 // 4 #Pi/4 * d30
xx = - x * x
denom = d30
nom = x
sum = nom
i = 2
while abs(nom) * d30 > denom:
nom = nom * xx
mul = i * (i + 1) * d60
denom = denom * mul
sum = sum * mul + nom
i += 2
print('0.' + str(d30 * sum // denom))
>> 0.707106780551955811469384356540
答案 1 :(得分:2)
使用泰勒展开式计算sin(x)
仅对于较小的参数(例如小于Pi / 2)稳定。对于较大的参数,您会遭受灾难性的取消,因为中间项非常大,例如对于x=100
,最大的项是第49个值
0.107151028812546692318354675952E43
。将所有这些大项加在一起,得到大小为<= 1
的sin()值。您将需要大约70个十进制数字,并用大约30个数字来计算结果。
解决方案是:使用范围缩小和多精度浮点例程
(请参阅我的开源Pascal MPArith软件包中的mpf_sin
)。使用交互式计算器,您将得到
sin(100) = -0.5063656411097587936565576104597854321
在0.2毫秒内。
答案 2 :(得分:-1)
program Project1;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
function sine(n: real): real;
asm
fld n
fsin
fstp Result
end;
var
n:real;
begin
write('Write the number: ');
readln(n);
writeln(sine(n):10:11);
readln;
end.