Отслеживание возможностей переполнения и исчезновения порядка при вычислениях, погрешность вычислений (Лабораторная работа № 1)

Страницы работы

Содержание работы

Министерство образования и науки Российской Федерации

Новосибирский государственный технический университет

Кафедра ПМт

Лабораторная работа №1

По программированию вычислений

Факультет:           ПМИ

Группа:                 ПМ – 64

Студенты:             Захаров Р. А.

                              Фельдман М. Л.

Преподаватель:    Рояк М. Э.

Вариант:               9

Новосибирск

2008


1. Постановка задачи

Ознакомление с основными операторами языка ФОРТРАН, отслеживание возможностей переполнения и исчезновения порядка при вычислениях, знакомство с погрешностью вычислений.

2. Метод решения

Угол из градусной меры в радианную переводится по формуле:

Угол из радианной меры в градусную переводится по формуле:

Неизвестный угол находится из двух известных сторон и угла по теореме синусов:

Площадь треугольника рассчитывается по формуле:


3. Текст программы

       subroutine invalid ()

       print*,'Error of entered data.It must be a number'

       end

       subroutine make_tri ()

       common/global/loga,a,b,angle_a,s,angle_b,angle_c,pi

       pi=3.1415926535897932384626433832795

1      loga=0

       print*,'Enter lenth of two sides and an angle'

       read *,a,b,angle_a

       if ((a.gt.0).and.(b.gt.0)) then

         if ((angle_a.gt.0).and.(angle_a.lt.180)) then

            if(((angle_a.ge.90).and.(a.gt.b)).or.(angle_a.lt.90)) then

            angle_a=angle_a/180.0*pi

                 if(a.ge.(b*sin(angle_a))) loga=1

            end if

        end if

       end if

       if (loga.eq.1) then

         print*,'information entered success'

       else

         print*,'Error in entered information'

       end if

       return

3      call invalid()

       goto 1

       end

       subroutine calc_tri ()

       common/global/loga,a,b,angle_a,s,angle_b,angle_c,pi

       if (loga.eq.1) then

        s=(a*b*sin(angle_a+asin(b*sin(angle_a)/a)))/2.0

        print*,'s=',s

       else

        s=0

        print*,'Unable to calculate'

       end if

       end

       subroutine min_angle (rmin)

       common/global/loga,a,b,angle_a,s,angle_b,angle_c,pi

       if (loga.eq.1) then

        angle_b=asin((b*sin(angle_a))/a)

        angle_c=pi-angle_a-angle_b

        rmin=min(angle_a,min(angle_b,angle_c))

                print*,'min angle',rmin/pi*180.0

        else

                angle_a=0

                angle_b=0

                angle_c=0

                rmin=0

                print*,'Unable to calculate'

       end if

       end

       subroutine min_cos (rmin,rmcos)

       common/global/loga,a,b,angle_a,s,angle_b,angle_c,pi

       if (loga.eq.1) then

        if (rmin.ne.0) then

                rmcos=cos(rmin)

        else

                angle_b=(b*sin(angle_a))/a

                angle_c=pi-angle_a-angle_b

                rmin=min(angle_a,angle_b,angle_c)

                rmcos=cos(rmin)

                end if

                print*,'min cos=',rmcos

       else

                angle_a=0

                angle_b=0

                angle_c=0

                rmin=0

                print*,'Unable to calculate'

       end if

       end

       program treugol

       common/global/loga,a,b,angle_a,s,angle_b,angle_c,pi

1      i=0

       print*,'1.if you want to make new triangle press 1'

       print*,'2.calculate area of triangle press 2'

       print*,'3.calculate min angle of triangle press 3'

       print*,'4.calculate cos of min angle of triangle press 4'

       print*,'5.exit press any key'

       read*,l

       if (l.eq.1) then

        call make_tri()

        i=1

       else

        if (l.eq.2) then

                call calc_tri()

                i=1

        else

                if (l.eq.3) then

                        call min_angle (rmin)

                        i=1

                else

                        if (l.eq.4) then

                                call min_cos (rmin,rmcos)

                                i=1

                        end if

                end if

        end if

       end if

       if (i)2,2,1

3      call invalid()

       goto 1

2      continue          

       end


4. Тесты

a

b

a

Результат работы программы

Примечание

10

100

100

Error in entered information

Рис.1

2

2

45

S=2.0

Рис.2

1

10

10

Error in entered information

Рис.3

1

1

180

Error in entered information

Угол в треугольнике не может быть = 1800

1

1

90

Error in entered information

Рис.4

0

8

45

Error in entered information

Введена сторона длиной = 0

5

4

90

S=5.99999

Рис.5

Рис.5:

Введен прямоугольный треугольник, его площадь найдена верно

 

Рис.4:

Невозможно построить треугольник

 


5. Исследование №1

Длина стороны a , при которой возникла особая ситуация=1019. Данная ситуация отображается на экране словом inf.

Длина стороны a , при которой возникла вторая особая ситуация=10-24. Данная ситуация отображается на экране числом 0.0000000

    Исследование №2

При зафиксированной сторонеa=108 нестандартная ситуация возникла при значении угла = 10-3 : значение косинуса минимального угла стало = 1.00, но cos 0.010= 0,999999984

При зафиксированной стороне a=109 нестандартная ситуация возникла при значении угла = 10-3 : значение косинуса минимального угла стало = 1.00, но cos 0.010= 0,999999984

6. Вывод

Похожие материалы

Информация о работе