Томский государственный университет систем управления и радиоэлектроники
Опубликован: 01.11.2012 | Доступ: свободный | Студентов: 637 / 74 | Длительность: 06:01:00
Лекция 2:

Типы данных

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Вещественная арифметика

Действительные числа представлены с определенной точностью.

a + (b+c) \ne (a+b) + c\\
(a+b)^2 \ne a^2+2ab+b^2
    a = 1.0/3; b = 4.0/7
      write(*,*) (a+b)**2                ! 0.8185941
      write(*,*) a**2+2*a*b+b**2    ! 0.8185942
    

Не рекомендуется сравнивать на равенство вещественные числа!


Переход от типа с меньшей точности к большей может привести к погрешности.

program lost_precision
    real(4) :: a = 1.03
    real(8) b
    
    b = a
    
    write(*,*) "a = ", a   ! 1.030000
    write(*,*) "b = ", b   ! 1.02999997138977
    
    end

Не следует использовать в одном выражении значения, различие между которыми превышает число значащих цифр.

    program arifm
    
    real(4) :: a = 1.E+10, b = -1.E+10, c = 5.0
    
    write(*,*) a+b+c  ! 5.000000
    write(*,*) a+c+b  ! 0.0000000E+00
    
    end

Деление вещественного числа на нуль – бесконечность.

    real(4) a,b
    a = 1.0/0.0    ! результат Infinity
    b = -1.0/0.0   ! -Infinity

Результат Nan "нет числа" – недопустимый результат.

    real(4) a,b
    a = (-2.0)**0.34 ! Nan
    b = asin(2.0)    ! Nan

Логическая функция IsNan(x) проверки на значение Nan.

Смешанная арифметика

Автоматическое приведение типов по схемам

"целый -> вещественный -> комплексный"

"от меньшей разрядности -> к большей"

Исключение – операция возведение в степень.

Запись 2**5 равносильна 2*2*2*2*2 2**5.0 равносильна exp(5.0*ln(2.0))

Преобразование типов может приводить к появлению погрешности !

Снижение погрешности

  1. Не вычитайте близкие числа.
  2. Не делите большие по модулю числа на малые.
  3. Сложение (вычитание) длинной последовательности чисел начинайте с меньших чисел.
  4. Уменьшайте число операций.
  5. Используйте алгоритмы, для которых известны оценки ошибок.
  6. Не сравнивайте на равенство вещественные числа.

Арифметические выражения

Математика Fortran
2a+3(b+c) 2*a+3*(b+c)
\frac {a+b}{c+d} (a+b)/(c+d)
\frac {a}{b\cdot c \cdot d} a/(b*c*d) или a/b/c/d
\sqrt[7]{a^5} a**(5.0/7.0)
a^2+b^5 a*a + b**5

Используйте дополнительные переменные для повышения читаемости кода программы.

Математические процедуры

Описание Имя
\sqrt x sqrt(x)
|x| abs(x)
e^x exp(x)
ln x log(x)
lg x log10(x)
shx sinh(x)
chx cosh(x)
thx tanh(x)
Im(z) animag(x)
Re(z) real(z)
|z|=\sqrt {x^2+y^2} abs(z)
сопряжение conjg(z)
остаток mod(a,b)
abs(a)умноженное на знак b sign(a,b)
округление \downarrow floor(x)
округление \uparrow ceiling(x)
максимум max(x1,…)
минимум min(x1,…)
max(x-y,0) dim(x,y)
радианы
sin (x)
cos(x)
tg x tan (x)
ctg x cotan (x)
arcsin x asin (x)
arccos x acos (x)
arctg x atan (x)
arctg(y/x) atan2 (y,x)
градусы
sind (x)
cosd(x)
tg x tand (x)
arcsin x asind (x)
arccos x acosd (x)
arctg x atand (x)
arctg(y/x) atan2d (y,x)

* Полный перечень, тип результата, тип аргумента и подробное описание функций см. HELP.

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >