如何在 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π。