Потеря (исчезновение) порядка
Пусть для
представления вещественного числа
выделено 3 разряда под мантиссу и 2 под
порядок.
Тогда при делении
двух чисел 0.425*10-27 и 0.561*1078
имеем:
0.425*10-27/0.561*1078
= 0.0757575…*10-105
= 0.757575…*10-106 = 0, т.е. все значения с
порядком, меньшим чем (-99) будут
восприниматься как «машинный нуль».
Катастрофическая потеря порядка
Пусть для
представления вещественного числа
выделено 3 разряда под мантиссу и 2 под
порядок. Тогда имеем:
0.425*10-27/0.561*1078*0.200*1087=0.0757575…*10-105*0.200*1087=0.757575…*
10-106*0.200*1087=0,
т.к. из предыдущего примера мы знаем,
что 0.757575…*10-106 есть 0 (вместо
ожидаемого результата 0.1515151*10-19).
Потеря значащих цифр
При выполнении
операций сложения и вычитания вещественных
чисел может произойти потеря значащих
цифр. Например,
-
10-9.82
= 0.18
(ожидаем)
10-9.82
= 0.100*1002–0.982*1001
= 0.100*1002–0.0982*1002=
0.100*1002–0.098*1002
= 0.002*1002
= 0.2 (получаем,
если проводилось усечение).
-
1000
– 999 = 1
(ожидаем)
1000
– 999 = 0.100*1004
– 0.999*1003
= 0.100*1004
– 0.0999*1004
=
0.100*1004
– 0.100*1004=0
(получаем, если
проводилось округление) или
1000 – 999 =
0.100*1004
– 0.999*1003
= 0.100*1004
– 0.0999*1004
=
0.100*1004
– 0.099*1004=0.001*1004
=10 (вместо
ожидаемой 1, если проводилось усечение).
Особенности выполнения операций отношения (сравнения)
Два вещественных
числа редко бывают точно равны. При
работе с вещественными числами следует
избегать проверки их на равенство.
Необходимо не напрямую сравнивать
числа, а произвести вычитание их по
модулю и сравнивать эту разность с
некоторым, наперед заданным, малым
числом.
Это связано с
погрешностью представления вещественных
значений в памяти. Значение величины,
с которой сравнивается модуль разности,
следует выбирать в зависимости от
решаемой задачи и точности переменных,
участвующих в выражении. Снизу эта
величина ограничена константами,
определенными в заголовочном файле
<float.h>:
FLT_EPSILON
= 1.192092896e-07F и
DBL_EPSILON =
2.2204460492503131e-016.
Примеры сравнения
вещественных чисел на точное равенство:
int
main()
{float
x=1;
x+=0.5;
//
значение x 1.5 имеет тип float
bool
b=(x==1.5);
//константа
1.5 имеет тип double
//
значение x и константа 1.5 представляются
в 2 с/с точно, поэтому
cout
<< b
<< endl; //
1
(true) !!!
_getch();
return
0;
}
int
main()
int
main()
{float
x=1;
x+=0.1;
//
значение x 1.1 имеет тип float
bool
b=(x==1.1);
//константа
1.1 имеет тип double
//
значение x и константа 1.1 представляются
в 2 с/с бесконечным числом, поэтому
cout
<< b
<< endl; //
0
(false) !!!
_getch();
return
0;
}
НО!!!
int
main()
int
main()
{double
x=1;
x+=0.1;
//
значение x 1.1 имеет тип double
bool
b=(x==1.1);
//константа
1.1 имеет тип double
//
хотя
значение
x и константа 1.1 представляются в 2 с/с
бесконечным числом
cout
<< b
<< endl; //
1
(true) !!!
_getch();
return
0;
}
Обратить внимание
Названные особые
случаи нарушают иногда и привычную
логику организации вычислений. Рассмотрим
два возможных случая.
Пример 1.
Вычисление y(x)
= (1-cos x) / x2.
Эта формула не работает для малых
значений х (уменьшаемое равно 1, вычитаемое
стремится к 1, все делится на малое
число). Для получения правильных
результатов формулу необходимо
преобразовать к виду z(x)
= 2 sin2 (x/2)
/ x 2.
Пример 2. Не
всегда выполняется и ассоциативный
закон сложения. Добавление или вычитание
малого (даже относительно малого) числа
может никак не сказаться на результате
(например, 1Е+15 и 1Е+10); необходимо
перестроить формулу вычислений настолько,
насколько это позволяет алгоритм или
вводить общий масштаб. Проанализируйте
примеры:
int
main()
{
double
x, y, z, r, v;
x=1.1e22;
y = -1.1e22; z= 1.0e2;
r=
(x+y)+z; cout<<r<<endl; //напечатает
100, т.к.
//(1.1e22
+ -1.1e22) + 1.0e2 = 0.0e22 + 1.0e2 = 100
r=
x+(y+z); cout << r <<endl; //напечатает
0, т.к.
//1.1e22
+ (-1.1e22 + 1.0e2) = 1.1e22 + (-1.1e22) = 0
_getch();
return
0;
}
Пример
3. Обращайте внимание
на типы переменных и констант. Их
несовпадение может доставить массу
неприятностей. Проанализируйте примеры:
int
main()
{double
a,b;
b=2.0e4
+ 1.0; //тип
констант double
и совпадает с типом переменной
a=b-2.0e4;
printf
(«%lfn»,
a); //1.000000
b=2.0e20
+ 1.0;
a=b-2.0e20;
printf
(«%lfn»,
a); //0.000000
_getch();
return
0;
}
НО!!!
int
main()
{
float
a,b;
b=2.0e4
+ 1.0;
//тип констант double
и не совпадает с типом переменной
a=b-2.0e4;
printf
(«%fn»,
a); //1.000000
b=2.0e20
+ 1.0;
a=b-2.0e20;
printf
(«%fn»,
a); //4008175468544.000000
//из-за
различной точности представления
значений
типов
float и double
_getch();
return
0;
}
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Исчезновение — порядок
Cтраница 1
Исчезновение порядка и потеря значимости не могут возникнуть.
[1]
Исчезновение порядка происходит, когда порядок результата должен иметь значение, меньшее — ( 2 — 1) — максимального по модулю отрицательного порядка. В таком случае результат приходится представлять машинным нулем.
[2]
Возникновение и исчезновение порядка в расположении атомов твердых растворов сопровождается изменением свойств. При упорядочении возрастают электропроводность, температурный коэффициент электрического сопротивления, твердость и прочность; снижается пластичность сплава. У ферромагнитных сплавов изменяются магнитные свойства: например, у пермаллоев ( магнитные сплавы железа с никелем) при упорядочении в несколько раз уменьшается магнитная проницаемость.
[4]
Имеет место исчезновение порядка.
[5]
Содержимое маски исчезновения порядка влияет также и на результат операции. Если бит маски равен 0, знак, характеристика и мантисса устанавливаются в 0, и результат становится истинным нулем. Если бит маски равен 1, мантисса нормализуется, характеристика становится на 128 больше истинного значения характеристики, а знак и мантисса остаются истинными.
[6]
Прерывание по исчезновению порядка происходит в том случае, если при выполнении арифметических операций характеристика результата оказалась меньше нуля, а мантисса результата при этом отлична от нуля.
[7]
Проверку переполнения и исчезновения порядка производят сервисные программы DVCHK и OVERFL. При возникновении переполнения или исчезновения порядка формируется сообщение об ошибке, и выполнение программы продолжается. При этом результаты дальнейших вычислений могут оказаться неверными. С помощью служебных программ пользователь может предусмотреть в своей программе распознавание возникшей ситуации и ее дальнейшую обработку.
[8]
Если прерывание является следствием переполнения или исчезновения порядка, печатается также неверный результат; если прерывание возникло при делении, результат устанавливается равным делимому.
[9]
Никогда не возникает переполнения порядка, исчезновения порядка или потери значимости.
[10]
Если характеристика результата С 0 — исчезновение порядка, то знаку, мантиссе и характеристике результата присваиваются нулевые значения.
[11]
Если прерывание является следствием переполнения или исчезновения порядка, печатается также неверный результат; если прерывание возникло при делении, результат устанавливается равным делимому.
[12]
Программа OVERFL проверяет возникновение переполнения порядка и исчезновение порядка.
[13]
S — неправильная спецификация, U — исчезновение порядка.
[14]
Старшие нулевые цифры из мантиссы результата не исключаются, исчезновение порядка не может произойти, а дополнительная цифра при распознавании потери значимости не используется.
[15]
Страницы:
1
2
3
4
Вопросы к тесту: «Основы алгоритмизации и программирования МТИ Синергия»
Цикл заканчивается, когда условие при очередной проверке оказывается …
*
Аппаратный стек реализуется на базе …
оперативной памяти
процессора
шины
внешнего устройства
В языке Си символам соответствует тип …
double
char
wchar
Общие регистры хранят…
вещественные числа
биты, которые устанавливаются в единицу или ноль
целые числа или адреса
Смысл языковых конструкций определяет …
синтаксис языка
транслятор
семантика языка
Длина строки …
занимает два байта
занимает один байт
имеет переменную длину
Для описания данных служат … операторы
исполняемые
неисполняемые
составные
Систему правил написания различных языковых конструкций описывает …
компилятор
синтаксис языка
мантисса
семантика языка
Операндами команды могут быть … памяти
только регистры
только элементы
регистры или элементы
В случае четырехбайтовых плавающих чисел (тип float языка Си) точность вычислений составляет примерно … десятичных цифр
9
7
16
15
Элементы, содержащиеся в аппаратном стеке, извлекаются в…
порядке по их помещению
обратном порядке по их помещению в стек
порядке их выполнения
C++, Object Pascal, Java относятся к …
процедурным языкам
аппликативным языкам
языкам логического программирования
объектно-ориентированным языкам
В программировании по возможности следует избегать типа …
double
float
char
Для Big Endian характерно:…
Тип ответа: Множественный выбор
старшие биты целого числа располагаются в байте со старшим адресом
байты внутри машинного слова нумеруются слева направо
байты внутри машинного слова нумеруются справа налево
старшие биты целого числа располагаются в байте с младшим адресом
Примером логического выражения «ложно» является …
х= = О
0! = О
3> = О
В языке Си логическое отрицание обозначается …
двойным амперсандом &&
двойной вертикальной чертой ||
восклицательным знаком «!»
Для отделения комментария будет использоваться знак …
Тип ответа: Одиночный выбор
/*….*/
// (двойная косая черта)
::
Для блока в соответствии с синтаксисом языка C++ для отделения комментария используется знак …
/*….*/
//
::
Для использования символов в кодировке Unicode язык C++ предоставляет тип wchar_t, в котором под каждый символ отводится …
один байт
переменная длина
два байта
Раньше других был придуман язык программирования …
Fortran
Assembler
Pascal
С
Таблица символов, в которой каждому идентификатору сопоставлен свой адрес, составляется на этапе … анализа
синтаксического
лексического
семантического
Последовательность операторов, изменяющих значение одной или нескольких ячеек, это …
процедурные языки
аппликативные языки
объектно-ориентированные языки
языки логического программирования
Язык … предназначен для обработки деловой информации
С
C#
С+ +
Cobol
Такая ошибка, как исчезновение порядка, может возникнуть при …
делении маленького числа на очень большое
умножении больших чисел
умножении двух очень маленьких по абсолютной величине чисел
К языкам программирования, которые применяются при удаленной обработке информации, относятся:…
LISP. Prolog
Perl, PHP, Java, C+ +
HTML, XML
Postscript TeX
Область памяти универсального исполнителя, хранящая порцию информации, называется …
переменной
константой
мантиссой
Когда в команде указывается константа, равная адресу аргумента, то это …
относительная адресация
индексная адресация с масштабированием
абсолютная адресация
косвенная адресация
Биты, которые устанавливаются в единицу или в ноль в зависимости от результата выполнения последней команды, содержатся в…
Тип ответа: Одиночный выбор
О регистре флагов
О плавающих регистрах
О общих регистрах
Языки программирования C++, COBOL, Java применяются в такой области человеческой деятельности, как …
издательская деятельность
удаленная обработка информации
обработка информации
системное программирование
Команды процессора еще называют …
инструкциями
указателями
логарифмами
массивами
.. это специальная программа, выполняющая перевод программы написанной на языке высокого уровня в язык машинных команд?
Компилятор
Кодировщик
Язык программирования
Система программирования
В языке Си целым числам соответствуют типы …
Тип ответа: Множественный выбор
double
int
bool
float
char
Универсальный язык программирования С был разработан Денисом Ритчи и Кеном Томпсоном в …?
начале 1960-х годов
конце 1960-х годов
середине 1970-х годов
начале 1980-х годов
Язык FORTRAN первоначально был стандартизирован в …
Тип ответа: Одиночный выбор
О 1965 г.
О 1966 г.
О 1976 г.
О 1977 г.
Минимальная единица языка, имеющая самостоятельный смысл, □ это …
константа
лексема
мантисса
транслятор
К языкам логического программирования относится язык …
Тип ответа: Одиночный выбор
О LISP
О Prolog
О Java
О FORTRAN
Когда в команде указывается регистр, содержащий адрес аргумента, то это …
Тип ответа: Одиночный выбор
О относительная адресация
О индексная адресация с масштабированием
О абсолютная адресация
О косвенная адресация
К языкам программирования, которые применяются при научных вычислениях, относятся:…?
C + +, COBOL, Java
Perl, PHP, Java, C + +
Postscript ТеХ
C + +, FORTRAN, Java
Константы обозначают…
сами числа
фактические адреса ячеек памяти
и сами числа, и фактические адреса ячеек памяти
Приблизительно точность вычислений вещественных чисел типа double составляет … десятичных цифр
О 16
О 7
О 20
О 9
… — любая положительная вещественная константа в форме с фиксированной точкой или целая константа
Мантисса
Компилятор
Константа
1. Универсальный язык программирования С был разработан Денисом Ритчи и Кеном Томпсоном в …
*начале 1960-х годов
*конце 1960-х годов
*середине 1970-х годов
*начале 1980-х годов
2. Система обозначений и правил, позволяющая записать программу решения задачи в виде последовательного текста в удобном для человека виде, – это …
*язык программирования
*компилятор
*ассемблер
3. Императивные языки иногда также называются …
*объектно-ориентированными
*языками языками логического программирования
*процедурными языками
*аппликативными языками
4. В языке Си двойным амперсандом && обозначается логическое …
*сложение
*умножение
*отрицание
5. Для блока в соответствии с синтаксисом языка C++ для отделения комментария используется знак …
*/* …. */
*//
*::
6. Приблизительно точность вычислений вещественных чисел типа double составляет … десятичных цифр
*16
*7
*20
*9
7. К языкам программирования, которые применяются при удаленной обработке информации, относятся: …
*LISP, Prolog
*Perl, PHP, Java, C++
*HTML, XML
*Postscript, TeX
8. Смысл языковых конструкций определяет …
*синтаксис языка
*транслятор
*семантика языка
9. … – любая положительная вещественная константа в форме с фиксированной точкой или целая константа
*Мантисса
*Компилятор
*Константа
10. К языкам логического программирования относится язык …
*LISP
*Prolog
*Java
*FORTRAN
11. Минимальная единица языка, имеющая самостоятельный смысл, это …
*константа
*лексема
*мантисса
*транслятор
12. Для отделения комментария будет использоваться знак …
*/* …. */
*// (двойная косая черта)
*::
13. Последовательность операторов, изменяющих значение одной или нескольких ячеек, это …
*процедурные языки
*аппликативные языки
*объектно-ориентированные языки
*языки логического программирования
14. Примером логического выражения «ложно» является …
*х= = 0
*0! = 0
*3> = 0
15. Биты, которые устанавливаются в единицу или в ноль в зависимости от результата выполнения последней команды, содержатся в …
*регистре флагов
*плавающих регистрах
*общих регистрах
16. Язык LISP относится к … языкам
*процедурным
*аппликативным
*объектно-ориентированным
17. Команды процессора еще называют …
*инструкциями
*указателями
*логарифмами
*массивами
18. Лексемами являются …
*ключевые слова, идентификаторы, символы операций, комментарии, пробелы и разделители *только ключевые слова и комментарии
*только идентификаторы, символы операций
*только комментарии
19. Элементы, содержащиеся в аппаратном стеке, извлекаются в…
*порядке по их помещению
*обратном порядке по их помещению в стек
*порядке их выполнения
20. В языке Си логическое отрицание обозначается …
*двойным амперсандом &&
*двойной вертикальной чертой ||
*восклицательным знаком «!»
21. Язык FORTRAN первоначально был стандартизирован в …
*1965 г.
*1966 г.
*1976 г.
*1977 г.
22. Цикл заканчивается, когда условие при очередной проверке оказывается …
23. Раньше других был придуман язык программирования …
*Fortran
*Assembler
*Pascal
*С
24. В языке Си символам соответствует тип …
*double
*сhar
*wchar
25. Для описания данных служат … операторы
*исполняемые
*неисполняемые
*составные
26. Когда в команде указывается регистр, содержащий адрес аргумента, то это …
*относительная адресация
*индексная адресация с масштабированием
*абсолютная адресация
*косвенная адресация
27. Объединение определенного числа однотипных данных это …
*последовательность
*список
*массив переменных
28. Язык … предназначен для обработки деловой информации
*C
*C#
*C++
*Cobol
29. В программировании по возможности следует избегать типа …
*double
*float
*char
30. … -это специальная программа, выполняющая перевод программы написанной на языке высокого уровня в язык машинных команд
*Компилятор
*Кодировщик
*Язык программирования
*Система программирования
31. Для Big Endian характерно: …
*старшие биты целого числа располагаются в байте со старшим адресом
*байты внутри машинного слова нумеруются слева направо
*байты внутри машинного слова нумеруются справа налево
*старшие биты целого числа располагаются в байте с младшим адресом
32. Область памяти универсального исполнителя, хранящая порцию информации, называется …
*переменной
*константой
*мантиссой
33. Языки программирования C++, COBOL, Java применяются в такой области человеческой деятельности, как …
*издательская деятельность
*удаленная обработка информации
*обработка информации
*системное программирование
34. Таблица символов, в которой каждому идентификатору сопоставлен свой адрес, составляется на этапе … анализа
*синтаксического
*лексического
*семантического
35. Систему правил написания различных языковых конструкций описывает …
*компилятор
*синтаксис языка
*мантисса
*семантика языка
36. Длина строки …
*занимает два байта
*занимает один байт
*имеет переменную длину
37. Общие регистры хранят …
*вещественные числа
*биты, которые устанавливаются в единицу или ноль
*целые числа или адреса
38. C++, Object Pascal, Java относятся к …
*процедурным языкам
*аппликативным языкам языкам
*логического программирования
*объектно-ориентированным языкам
39. Для использования символов в кодировке Unicode язык C++ предоставляет тип wchar_t, в котором под каждый символ отводится …
*один байт
*переменная длина
*два байта
40. Такая ошибка, как исчезновение порядка, может возникнуть при …
*делении маленького числа на очень большое
*умножении больших чисел
*умножении двух очень маленьких по абсолютной величине чисел
41. В языке Си целым числам соответствуют типы …
*double
*int
*bool
*float
*char
42. Аппаратный стек реализуется на базе …
*оперативной памяти
*процессора
*шины
*внешнего устройства