如何在 Lazarus (pascal) 中使用 arccos
How to use arccos in Lazarus (pascal)
我必须编写一个程序来找出三角形的内角。出于某种原因,我总是收到导致程序崩溃的消息 'INVALID OPERATION'。有人可以帮助我吗?
function Winkela(a,b,c:real):float;
var alpha:real;
begin
alpha:= (b*b)+(c*c)-(a*a)/(2*b*c);
radtodeg(arccos(alpha));
end;
function Winkelb(a,b,c:real):float;
var beta:real;
begin
beta:= (c*c)+(a*a)-(b*b)/(2*c*a);
radtodeg(arccos(beta));
end;
function Winkelc(a,b,c:real):float;
var gamma:real;
begin
gamma:= (a*a)+(b*b)-(c*c)/(2*a*b);
radtodeg(arccos(gamma));
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:real;
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
c:=strtofloat(edit3.text);
edit4.text:=floattostr(Winkela(a,b,c));
edit5.text:=floattostr(Winkelb(a,b,c));
edit6.text:=floattostr(Winkelc(a,b,c));
end;
你计算
alpha := (b*b)+(c*c)-(a*a)/(2*b*c)
鉴于上下文(“三角形的角度”),我认为应该是 law of cosines 的应用。但这样错误就很明显了。你要
alpha := ((b*b)+(c*c)-(a*a))/(2*b*c).
例如,如果 a = 3,b = 4,c = 5,则
(b*b)+(c*c)-(a*a)/(2*b*c) = 16 + 25 - 9/40 = 40.775
而
((b*b)+(c*c)-(a*a))/(2*b*c) = (16 + 25 - 9)/40 = 32/40 = 0.8.
在第一种情况下,您得到 cos α = 40.775,这显然没有实数解,因为 cos α 对于所有实角 α 都属于 [−1, 1]。因此,您真正的 ArcCos
函数将引发异常。
在后一种情况下,没有问题:cos α = 0.8 意味着存在一个整数 n 使得 α = ±arccos(0.8) + 2nπ。
我必须编写一个程序来找出三角形的内角。出于某种原因,我总是收到导致程序崩溃的消息 'INVALID OPERATION'。有人可以帮助我吗?
function Winkela(a,b,c:real):float;
var alpha:real;
begin
alpha:= (b*b)+(c*c)-(a*a)/(2*b*c);
radtodeg(arccos(alpha));
end;
function Winkelb(a,b,c:real):float;
var beta:real;
begin
beta:= (c*c)+(a*a)-(b*b)/(2*c*a);
radtodeg(arccos(beta));
end;
function Winkelc(a,b,c:real):float;
var gamma:real;
begin
gamma:= (a*a)+(b*b)-(c*c)/(2*a*b);
radtodeg(arccos(gamma));
end;
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:real;
begin
a:=strtofloat(edit1.text);
b:=strtofloat(edit2.text);
c:=strtofloat(edit3.text);
edit4.text:=floattostr(Winkela(a,b,c));
edit5.text:=floattostr(Winkelb(a,b,c));
edit6.text:=floattostr(Winkelc(a,b,c));
end;
你计算
alpha := (b*b)+(c*c)-(a*a)/(2*b*c)
鉴于上下文(“三角形的角度”),我认为应该是 law of cosines 的应用。但这样错误就很明显了。你要
alpha := ((b*b)+(c*c)-(a*a))/(2*b*c).
例如,如果 a = 3,b = 4,c = 5,则
(b*b)+(c*c)-(a*a)/(2*b*c) = 16 + 25 - 9/40 = 40.775
而
((b*b)+(c*c)-(a*a))/(2*b*c) = (16 + 25 - 9)/40 = 32/40 = 0.8.
在第一种情况下,您得到 cos α = 40.775,这显然没有实数解,因为 cos α 对于所有实角 α 都属于 [−1, 1]。因此,您真正的 ArcCos
函数将引发异常。
在后一种情况下,没有问题:cos α = 0.8 意味着存在一个整数 n 使得 α = ±arccos(0.8) + 2nπ。