Home > Blockchain >  How to use arccos in Lazarus (pascal)
How to use arccos in Lazarus (pascal)

Time:05-22

I have to write a program to find out the angles of a triangle. For some reason I always get the message 'INVALID OPERATION' which results in the program crashing. Can someone help me?

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;  

CodePudding user response:

You compute

alpha := (b*b) (c*c)-(a*a)/(2*b*c)

which, given the context ("the angles of a triangle"), I assume should be an application of the law of cosines. But then the mistake is obvious. You want

alpha := ((b*b) (c*c)-(a*a))/(2*b*c).

For instance, if a = 3, b = 4, and c = 5, then

(b*b) (c*c)-(a*a)/(2*b*c) = 16   25 - 9/40 = 40.775

whereas

((b*b) (c*c)-(a*a))/(2*b*c) = (16   25 - 9)/40 = 32/40 = 0.8.

In the first case, you get cos α = 40.775 which clearly has no real solution, since cos α belongs to [−1, 1] for all real angles α. Hence, your real ArcCos function will raise an exception.

In the latter case, there is no problem: cos α = 0.8 implies that there is an integer n such that α = ±arccos(0.8) 2nπ.

  • Related