Writeln输出扩展数据类型为浮点而不是科学表达式

时间:2018-11-18 04:47:59

标签: delphi math

晚安,我在Embarcadero 10.2上的writeln遇到问题,我试图将sin()函数编写为泰勒展开式无限系列。

一切正常,但是输出的科学表达式为:3.60448486921676E-0158,正确的是0.912945250727627654376099983845。

我需要30位精度。我下面的代码是一个控制台程序。

%ed deleted_function

3 个答案:

答案 0 :(得分:2)

要执行非常长的精度计算,您需要一些用于任意精度算术的库-使用GMP的Delphi包装器/接口或某些Delphi库。 ExampleAnother 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.