How to resolve the algorithm Roots of a quadratic function step by step in the ERRE programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Roots of a quadratic function step by step in the ERRE programming language

Table of Contents

Problem Statement

Write a program to find the roots of a quadratic equation, i.e., solve the equation

a

x

2

b x + c

0

{\displaystyle ax^{2}+bx+c=0}

. Your program must correctly handle non-real roots, but it need not check that

a ≠ 0

{\displaystyle a\neq 0}

. The problem of solving a quadratic equation is a good example of how dangerous it can be to ignore the peculiarities of floating-point arithmetic. The obvious way to implement the quadratic formula suffers catastrophic loss of accuracy when one of the roots to be found is much closer to 0 than the other. In their classic textbook on numeric methods Computer Methods for Mathematical Computations, George Forsythe, Michael Malcolm, and Cleve Moler suggest trying the naive algorithm with

a

1

{\displaystyle a=1}

,

b

10

5

{\displaystyle b=-10^{5}}

, and

c

1

{\displaystyle c=1}

. (For double-precision floats, set

b

10

9

{\displaystyle b=-10^{9}}

.) Consider the following implementation in Ada: As we can see, the second root has lost all significant figures. The right answer is that X2 is about

10

− 6

{\displaystyle 10^{-6}}

. The naive method is numerically unstable. Suggested by Middlebrook (D-OA), a better numerical method: to define two parameters

q

a c

/

b

{\displaystyle q={\sqrt {ac}}/b}

and

f

1

/

2 +

1 − 4

q

2

/

2

{\displaystyle f=1/2+{\sqrt {1-4q^{2}}}/2}

and the two roots of the quardratic are:

− b

a

f

{\displaystyle {\frac {-b}{a}}f}

and

− c

b f

{\displaystyle {\frac {-c}{bf}}}

Task: do it better. This means that given

a

1

{\displaystyle a=1}

,

b

10

9

{\displaystyle b=-10^{9}}

, and

c

1

{\displaystyle c=1}

, both of the roots your program returns should be greater than

10

− 11

{\displaystyle 10^{-11}}

. Or, if your language can't do floating-point arithmetic any more precisely than single precision, your program should be able to handle

b

10

6

{\displaystyle b=-10^{6}}

. Either way, show what your program gives as the roots of the quadratic in question. See page 9 of "What Every Scientist Should Know About Floating-Point Arithmetic" for a possible algorithm.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Roots of a quadratic function step by step in the ERRE programming language

Source code in the erre programming language

PROGRAM QUADRATIC

PROCEDURE SOLVE_QUADRATIC
  D=B*B-4*A*C
  IF ABS(D)<1D-6 THEN D=0 END IF
  CASE SGN(D) OF
    0->
       PRINT("the single root is ";-B/2/A)
    END ->
    1->
       F=(1+SQR(1-4*A*C/(B*B)))/2
       PRINT("the real roots are ";-F*B/A;"and ";-C/B/F)
    END ->
    -1->
       PRINT("the complex roots are ";-B/2/A;"+/-";SQR(-D)/2/A;"*i")
    END ->
  END CASE
END PROCEDURE

BEGIN
  PRINT(CHR$(12);) ! CLS
  FOR TEST%=1 TO 7 DO
     READ(A,B,C)
     PRINT("For a=";A;",b=";B;",c=";C;TAB(32);)
     SOLVE_QUADRATIC
  END FOR
  DATA(1,-1E9,1)
  DATA(1,0,1)
  DATA(2,-1,-6)
  DATA(1,2,-2)
  DATA(0.5,1.4142135,1)
  DATA(1,3,2)
  DATA(3,4,5)
END PROGRAM


  

You may also check:How to resolve the algorithm Factors of an integer step by step in the Lambdatalk programming language
You may also check:How to resolve the algorithm Long multiplication step by step in the NetRexx programming language
You may also check:How to resolve the algorithm Evolutionary algorithm step by step in the ALGOL 68 programming language
You may also check:How to resolve the algorithm 99 bottles of beer step by step in the Sparkling programming language
You may also check:How to resolve the algorithm Program name step by step in the 11l programming language