Что значит неверная вещественная операция

Содержание
  1. Ошибка: неверная вещественная операция
  2. Неверная вещественная операция
  3. Неверная вещественная операция — Pascal — Обсуждение 174845
  4. Сообщения и коды ошибок
  5. Представление вещественных чисел
  6. Содержание
  7. Нормальная и нормализованная форма [ править ]
  8. Типы чисел с плавающей точкой (по IEEE 754) [ править ]
  9. Число половинной точности (Binary16, Half precision) [ править ]
  10. Число одинарной точности (Binary32, Single precision, float) [ править ]
  11. Число двойной точности (Binary64, Double precision, double) [ править ]
  12. Число четверной точности (Binary128, Quadruple precision) [ править ]
  13. Диапазон значений чисел с плавающей запятой [ править ]
  14. Особые значения чисел с плавающей точкой [ править ]
  15. Ноль (со знаком) [ править ]
  16. Неопределенность (NaN) [ править ]
  17. Бесконечности [ править ]
  18. Денормализованные числа [ править ]
  19. Действия с числами с плавающей запятой [ править ]
  20. Умножение и деление [ править ]
  21. Сложение и вычитание [ править ]
  22. Алгоритм получения представления вещественного числа в памяти ЭВМ [ править ]

Ошибка: неверная вещественная операция

Здравствуйте.. Делаю курсач по ВТИР, написал программу. Все работало, но не долго.

доходит до сюда:

и выдает: Ошибка: неверная вещественная операция.

Переменные А,Е,Хi:real, массив: integer

подскажите пожалуйста как быть

Ошибка: неверная вещественная операция
не знаю в чем проблема!! выдает: неверная вещественная операция строка 35 program primer_; .

Ошибка: неверная вещественная операция
Подскажите пожалуйста, как можно исправить? «неверная вещественная операция, строка 17» program.

Ошибка: неверная вещественная операция
var k:Longint; s,x:real; begin k:=0; x:=0.3; s:=0; repeat k:=k+1;.

PM[i]-Xi[n] — возможно здесь отрицательный результат.

Добавлено через 20 секунд
Можно полный текст программы увидеть?

блин, а ведь точно. логарифм от отрицательного числа. Выходит нужно добавить условие и в случае отрицательного числа брать эту скобку по модулю, а в результат добавлять минус? Или есть варианты проще?

Неверная вещественная операция
Здравствуйте. Помогите найти ошибку. пишет «неверная вещественная операция. строка 19» program.

Неверная вещественная операция
program g7_n11; var x,y:real; begin Writeln(‘Введите x’); Readln(x); .

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

Источник

Неверная вещественная операция

не знаю в чем проблема!!
выдает:
неверная вещественная операция строка 28

Неверная вещественная операция
Помогите пожалуйста , пишет неверную вещественную операцию 17-й строки. uses crt; type vec=array .

Неверная Вещественная Операция
Здравствуйте. Проверьте пожалуйста мой пример. На каком основании возникает ошибка в моём тексте.

Господа, у меня эта же проблема, поможете понять в чем ошибка?

С Pascal’ем знаком не очень давно, ради шутки юмора решил написать программу для решении стандартных квадратных уравнений, вроде все прописываю правильно, но он пишет ошибку! Вот:

введи a,b,c,y
1 2 5 0
Корней нет
»*Ошибка: неверная вещественная операция (Решение квадратных уравнений.pas, строка 20)

Кто знает, где я ошибся.

Я пытался выкинуть «y». Но когда я прописывал строчку 14

без «y» он писал: «ожидалось :=»

Я решил, что в принципе лишних хлопот «y» не доставит, тем более в таких уравнениях он всегда равен 0. Но спасибо, за исправление, я никак не мог понять в чем я ошибся)))

78 строка. помогите, а?

Добавлено через 39 минут
Прога должна создавать отсортированые индексные файлы,
искать там инфу, печать,принимать новые даные. да там менюшка есть, поймёте

Добавлено через 4 минуты
Прога должна создавать отсортированые индексные файлы,
искать там инфу, печать,принимать новые даные. да там менюшка есть, поймёте

Здравствуйте,уважаемые форумчане,вопрос жизни и смерти,у меня выскакивает неверная вещественная операция строка 15,помогите иначе я пропал

лучше бы ты не лез в чужие темы.

Странно вот препод дал по линейным листинг с примером грит:»делай»

То что вы напечатали,это уже другая тема «разветвляющиеся вычислительные процессы»

Ну ладно,и на том спасибо, можете себя не утруждать,я сам как нибудь.

Добавлено через 1 час 23 минуты
Все,разобрался)без всяких then и else )все работает — калькулем проверил — сходится)спасибо).

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

Неверная вещественная операция
program g7_n11; var x,y:real; begin Writeln(‘Введите x’); Readln(x); .

Неверная вещественная операция
Здравствуйте. Помогите найти ошибку. пишет «неверная вещественная операция. строка 19» program.

Неверная вещественная операция
Изучил много тем на форуме, но так и не понял что у меня не так, подскажите пожалуйста var.

Источник

Неверная вещественная операция — Pascal — Обсуждение 174845

Поиск Google по форуму Поиск по форуму Расширенный поиск Имя Дата Сообщение Читать обсуждение полностью:
Неверная вещественная операция
leronas 11.10.2010 02:25 https://www.cyberforum.ru/post1018669.html

Неверная вещественная операция
Помогите пожалуйста , пишет неверную вещественную операцию 17-й строки. uses crt; type vec=array .

Неверная Вещественная Операция
Здравствуйте. Проверьте пожалуйста мой пример. На каком основании возникает ошибка в моём тексте.

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

Неверная вещественная операция
program g7_n11; var x,y:real; begin Writeln(‘Введите x’); Readln(x); .

Неверная вещественная операция
Здравствуйте. Помогите найти ошибку. пишет «неверная вещественная операция. строка 19» program.

Неверная вещественная операция
Изучил много тем на форуме, но так и не понял что у меня не так, подскажите пожалуйста var.

Источник

Сообщения и коды ошибок

  1. Out of memory (выход за границы памяти) Компилятору не хватает памяти. Имеется ряд возможных решений этой проблемы:
  • Если в опции COMPILE/DESTINATION установлено значение MEMORY, замените эту опцию на DISK.
  • Если в опции OPTIONS/COMPILER/LINK установлено значение MEMORY, замените эту опцию на DISK.
  • Если Вы используете постоянно помещенные в память (резидентные) обслуживающие программы, такие как WINDOWS, SIDEKICK, NORTON
    удалите их из памяти.
  • Если Вы используете интегрированную среду TURBO.EXE, то попробуйте воспользоваться компилятором ТРС.ЕХЕ, он занимает меньше памяти.
  • Если ни одна из рекомендаций не помогает, то, возможно, Ваша программа просто слишком велика, чтобы компилировать ее в таком объеме памяти. В этом случае Вы должны разбить её на два или более модулей.
  • Indentifier expected (не указан идентификатор). Этот идентификатор не был описан.
  • Unknow indentifier (неизвестный идентификатор). Этот идентификатор не был описан.
  • Duplicate indentifier (двойной идентификатор). Попытка дважды описать один и тот же идентификатор.
  • Syntax error (синтаксическая ошибка). В исходном тексте найден неверный символ. Возможно, Вы забыли заключить в кавычки строковую константу.
  • Error in real constant (ошибка в вещественной константе).
  • Error in integer constant (ошибка в целой константе). Учтите, что после целых действительных чисел, превышающих диапазон представления целых чисел (-2147483648. +2147483647), должны ставиться точка и нуль, например 12345678912.0.
  • String constant exceeds line (строковая константа превышает допустимые размеры). Вероятно, Вы забыли поставить апостроф в конце строковой константы.
  • Too many nested files (слишком много вложенных файлов). Компилятор допускает не более пяти вложенных исходных файлов.
  • Unexpected end of file (не найден конец файла). Вы могли получить это сообщение об ошибке по одной из следующих причин:

      Ваш исходный файл закончился перед последним END основного раздела

    Источник

    Представление вещественных чисел

    Вещественные числа обычно представляются в виде чисел с плавающей запятой. Числа с плавающей запятой — один из возможных способов представления действительных чисел, который является компромиссом между точностью и диапазоном принимаемых значений, его можно считать аналогом экспоненциальной записи чисел, но только в памяти компьютера.

    Число с плавающей запятой состоит из набора отдельных двоичных разрядов, условно разделенных на так называемые знак (англ. sign), порядок (англ. exponent) и мантиссу (англ. mantis). В наиболее распространённом формате (стандарт IEEE 754) число с плавающей запятой представляется в виде набора битов, часть из которых кодирует собой мантиссу числа, другая часть — показатель степени, и ещё один бит используется для указания знака числа ( [math]0[/math] — если число положительное, [math]1[/math] — если число отрицательное). При этом порядок записывается как целое число в коде со сдвигом, а мантисса — в нормализованном виде, своей дробной частью в двоичной системе счисления. Вот пример такого числа из [math]16[/math] двоичных разрядов:

    Знак
    Порядок Мантисса
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    14 10 9 0

    Знак — один бит, указывающий знак всего числа с плавающей точкой. Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде:

    [math](-1)^S \times M \times B^E[/math] , где [math]S[/math] — знак, [math]B[/math] — основание, [math]E[/math] — порядок, а [math]M[/math] — мантисса. Десятичное число, записываемое как [math] ReE[/math] , где [math]R[/math] — число в полуинтервале [math][1; 10)[/math] , [math]E[/math] — степень, в которой стоит множитель [math]10[/math] ; в нормализированной форме модуль [math]R[/math] будет являться мантиссой, а [math]E[/math] — порядком, а [math]S[/math] будет равно [math]1[/math] тогда и только тогда, когда [math]R[/math] принимает отрицательное значение. Например, в числе [math]-2435e9[/math]

    • [math]S[/math] [math]=[/math] [math]1[/math]
    • [math]B[/math] [math]=[/math] [math]10[/math]
    • [math]M[/math] [math]=[/math] [math]2435[/math]
    • [math]E[/math] [math]=[/math] [math]9[/math]

    Порядок также иногда называют экспонентой или просто показателем степени.

    При этом лишь некоторые из вещественных чисел могут быть представлены в памяти компьютера точным значением, в то время как остальные числа представляются приближёнными значениями.

    Более простым вариантом представления вещественных чисел является вариант с фиксированной точкой, когда целая и вещественная части хранятся отдельно. Например, на целую часть отводится всегда [math]X[/math] бит и на дробную отводится всегда [math]Y[/math] бит. Такой способ в архитектурах процессоров не присутствует. Отдаётся предпочтение числам с плавающей запятой, как компромиссу между диапазоном допустимых значений и точностью.

    Содержание

    Нормальная и нормализованная форма [ править ]

    Нормальной формой (англ. normal form) числа с плавающей запятой называется такая форма, в которой мантисса (без учёта знака) в десятичной системе находится на полуинтервале [math][0; 1)[/math] . Такая форма записи имеет недостаток: некоторые числа записываются неоднозначно (например, [math]0<,>0001[/math] можно записать в 4 формах — [math]0<,>0001 \times 10[/math] [math]0[/math] , [math]0<,>001 \times 10[/math] [math]−1[/math] , [math]0<,>01 \times 10[/math] [math]−2[/math] , [math]0<,>1 \times 10[/math] [math]−3[/math] ), поэтому распространена также другая форма записи — нормализованная (англ. normalized), в которой мантисса десятичного числа принимает значения от [math]1[/math] (включительно) до [math]10[/math] (не включительно), а мантисса двоичного числа принимает значения от [math]1[/math] (включительно) до [math]2[/math] (не включительно). То есть в мантиссе слева от запятой до применения порядка находится ровно один знак. В такой форме любое число (кроме [math]0[/math] ) записывается единственным образом. Ноль же представить таким образом невозможно, поэтому стандарт предусматривает специальную последовательность битов для задания числа [math]0[/math] (а заодно и некоторых других полезных чисел, таких как [math]-\infty[/math] и [math]+\infty[/math] ). Так как старший двоичный разряд (целая часть) мантиссы вещественного числа в нормализованном виде всегда равен « [math]1[/math] », то его можно не записывать, сэкономив таким образом один бит, что и используется в стандарте IEEE 754. В позиционных системах счисления с основанием большим, чем [math]2[/math] (в троичной, четверичной и др.), этого замечательного свойства нет (ведь целая часть там может быть не только единицей).

    Типы чисел с плавающей точкой (по IEEE 754) [ править ]

    Число половинной точности (Binary16, Half precision) [ править ]

    Число́ полови́нной то́чности — компьютерный формат представления чисел, занимающий в памяти половину машинного слова (в случае 32-битного компьютера — [math]16[/math] бит или [math]2[/math] байта). В силу невысокой точности этот формат представления чисел с плавающей запятой обычно используется в видеокартах, где небольшой размер и высокая скорость работы важнее точности вычислений.

    Знак
    Порядок Мантисса
    0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0
    14 10 9 0

    Порядок записан со сдвигом [math]-15[/math] . То есть чтобы получить актуально значение порядка нужно вычесть из него сдвиг. Сдвиг можно получить по формуле [math]2^-1[/math] , где [math]b[/math] — число бит, отведенное на хранение порядка (в случае числа половинной точности [math]b=5[/math] ).

    • Целые от нуля до [math]2048[/math] передаются как есть.
    • Целые от [math]2049[/math] до [math]4096[/math] округляются к ближайшему чётному целому.
    • Целые от [math]4097[/math] до [math]8192[/math] округляются до ближайшего целого, делящегося нацело на четыре.
    • Целые от [math]8193[/math] до [math]16384[/math] округляются до ближайшего целого, делящегося на восемь.
    • Целые от [math]16385[/math] до [math]32768[/math] округляются до ближайшего целого, делящегося на шестнадцать.
    • Целые от [math]32769[/math] до [math]65535[/math] округляются до ближайшего целого, делящегося на тридцать два.

    Число одинарной точности (Binary32, Single precision, float) [ править ]

    Число́ одина́рной то́чности — компьютерный формат представления чисел, занимающий в памяти одно машинное слово (в случае 32-битного компьютера — [math]32[/math] бита или [math]4[/math] байта). Используется для работы с вещественными числами везде, где не нужна очень высокая точность.

    Знак
    Порядок (8 бит) Мантисса (23+1 бита)
    0 0 0 0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    30 23 22 0

    Порядок записан со сдвигом [math]-127[/math] .

    Число двойной точности (Binary64, Double precision, double) [ править ]

    Число́ двойно́й то́чности — компьютерный формат представления чисел, занимающий в памяти два машинных слова (в случае 32-битного компьютера — [math]64[/math] бита или [math]8[/math] байт). Часто используется благодаря своей неплохой точности, даже несмотря на двойной расход памяти и сетевого трафика относительно чисел одинарной точности.

    Знак
    Порядок
    (11 бит)
    Мантисса
    (52+1 бит)
    0 0 0 0 0 0 0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    62 52 51 0

    Порядок записан со сдвигом [math]-1023[/math] .

    Число четверной точности (Binary128, Quadruple precision) [ править ]

    Число́ четверно́й то́чности — компьютерный формат представления чисел, занимающий в памяти четыре машинных слова (в случае 32-битного компьютера — [math]128[/math] бит или [math]16[/math] байт). Используется в случае необходимости крайне высокой точности.

    Знак
    Порядок
    (15 бит)
    Мантисса
    (112+1 бит)
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    126 112 111
    Мантисса
    (112+1 бит)
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0

    Порядок записан со сдвигом [math]-16383[/math] .

    Обычно этот формат реализуется программно, случаи аппаратной реализации крайне редки. Также не гарантируется поддержка этого типа в языках программирования, хотя кое-где она и реализована (например, компилятор gcc для архитектуры x86 позволяет использовать тип __float128, являющийся программной реализацией числа с четверной точностью). В совокупности эти факторы делают Quadruple весьма экзотичным и редко встречающимся форматом чисел с плавающей запятой.

    Диапазон значений чисел с плавающей запятой [ править ]

    Диапазон чисел, которые можно записать данным способом, зависит от количества бит, отведённых для представления мантиссы и показателя. Пара значений показателя (когда все разряды нули и когда все разряды единицы) зарезервирована для обеспечения возможности представления специальных чисел. К ним относятся ноль, значения NaN (Not a Number, «не число», получается как результат операций типа деления нуля на ноль) и [math]\pm\infty[/math] .

    Данная таблица только лишь примерно указывает границы допустимых значений, без учета возрастающей погрешности с ростом абсолютного значения и существования денормализованных чисел.

    Название в IEEE 754 Название типа переменной в Си Диапазон значений Бит в мантиссе Бит на переменную
    Half precision 6,10×10 -5 ..65504 11 16
    Single presicion float -3,4×10 38 ..3,4×10 38 23 32
    Double precision double -1,7×10 308 ..1,7×10 308 53 64
    Extended precision На некоторых архитектурах (например в сопроцессоре Intel) long double -3,4×10 4932 ..3,4×10 4932 65 80

    Особые значения чисел с плавающей точкой [ править ]

    Ноль (со знаком) [ править ]

    Как уже было оговорено выше, в нормализованной форме числа с плавающей точкой невозможно представить ноль. Поэтому для его представления зарезервированы специальные значения мантиссы и порядка — число считается нулём, если все его биты, кроме знакового, равны нулю. При этом в зависимости от значения бита знака ноль может быть как положительным, так и отрицательным.

    Знак
    Порядок Мантисса
    0 /1 0 0 0 0 0 1, 0 0 0 0 0 0 0 0 0 0 = [math]\pm0[/math]
    14 10 9 0

    Арифметика нуля со знаком
    Арифметика отрицательного нуля аналогична таковой для любого отрицательного числа и понятна интуитивно. Вот несколько примеров:

    Неопределенность (NaN) [ править ]

    NaN — это аббревиатура от фразы «not a number«. NaN является результатом арифметических операций, если во время их выполнения произошла ошибка (примеры см. ниже). В IEEE 754 NaN представлен как число, в котором все двоичные разряды порядка — единицы, а мантисса не нулевая.

    Знак
    Порядок Мантисса
    0 /1 1 1 1 1 1 1, 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 0 /1 = [math]NaN[/math]
    14 10 9 0

    Любая операция с NaN возвращает NaN. При желании в мантиссу можно записывать информацию, которую программа сможет интерпретировать. Стандартом это не оговорено и мантисса чаще всего игнорируется.

    Как можно получить NaN?

    Есть и другие способы получения NaN, подробности можно найти по ссылкам в соответствующем разделе.

    По определению NaN ≠ NaN, поэтому, для проверки значения переменной нужно просто сравнить ее с собой.

    Бесконечности [ править ]

    В число с плавающей запятой можно записать значение [math]+\infty[/math] или [math]-\infty[/math] . Как и нули со знаком, бесконечности позволяют получить хотя бы близкий к правильному результат вычисления в случае переполнения. Согласно стандарту IEEE 754 число с плавающей запятой считается равным бесконечности, если все двоичные разряды его порядка — единицы, а мантисса равна нулю. Знак бесконечности определяется знаковым битом числа.

    Знак
    Порядок Мантисса
    0 /1 1 1 1 1 1 1, 0 0 0 0 0 0 0 0 0 0 = [math]\pm\infty[/math]
    14 10 9 0

    Получить бесконечность можно при переполнении и при делении ненулевого числа на ноль. При этом [math] \frac <0>[/math] [math]= \begin +\infty,&\text<если $x\gt 0$;>\\ NaN,&\text<если $x=0$;>\\ -\infty,&\text <если $x\lt 0$.>\end [/math]

    Денормализованные числа [ править ]

    Денормализованные числа (англ. denormalized/subnormal numbers) — это способ увеличить количество представимых числом с плавающей запятой значений около нуля, дабы повысить точность вычислений. Каждое значение денормализованного числа меньше самого маленького нормализованного («обычного») значения числа с плавающей запятой. Согласно стандарту, если порядок равен своему минимальному значению (все его биты — нули, а истинное значение порядка равно его сдвигу) и все биты мантиссы равны нулю, то это [math]\pm0[/math] . Если же мантисса не равна нулю, то это число с порядком, на единицу большим минимального (все биты порядка, кроме младшего — нули) и данной мантиссой, целая часть которой считается равной нулю, а не единице.

    То есть число с плавающей запятой, при учете вышесказанного, можно задать следующим образом:

    • [math](-1)^s\times1,M\times2^E[/math] , если [math]E_ \le E \le E_[/math] (нормализованное число)
    • [math](-1)^s\times0,M\times2^>[/math] , если [math]E=E_-1[/math] (денормализованное число)

    Где [math]s[/math] — бит знака, [math]M[/math] — последовательность битов мантиссы, [math]E[/math] — значение порядка (с учетом сдвига), [math]E_[/math] — минимальное значение порядка, используемое для записи чисел (1 — сдвиг) , [math]E_-1[/math] — минимальное значение порядка, которое он в принципе может принять (все биты нули, 0 — сдвиг).

    Хоть денормализованные числа и позволяют бороться с погрешностями и обрабатывать очень маленькие значения, за эти возможности приходится дорого платить. Ввиду сложности денормализованные числа крайне редко реализуют на аппаратном уровне — вместо этого используются программные реализации, работающие значительно медленнее.

    В современных процессорах обработка денормализованных чисел происходит в десятки раз медленнее, чем обработка нормализованных чисел. Ниже приведена часть таблицы из статьи Isaac Dooley, Laxmikant Kale «Quantifying the Interference Caused by Subnormal Floating-Point Values» [1]

    Производитель Процессор Замедление (разы)
    IBM PowerPC 970 2,4
    AMD Athlon 6,0
    Intel Pentium 3 15,8
    AMD Athlon 64 21,4
    AMD Opteron64 23,8
    Intel Core Duo 44,2
    Intel P4 Xeon 97,9
    Intel Pentium 4 131,0
    Intel Itanium 2 183,2
    Sun UltraSPARC IV 520,0

    В таблице приведены наихудшие результаты тестирования среди всех использованных компиляторов (gcc, icc, xlc) со всеми доступными флагами оптимизации. Исследователи утверждают, что различие среднего случая с худшим незначительно.

    Поскольку в стандартных форматах (одинарной и двойной точности) денормализованные числа получаются действительно очень маленькими и практически никак не влияют на результат некоторых вычислений (при этом заметно замедляя их скорость), то иногда они просто игнорируются. При этом используются два простых механизма, получивших называние Flush-to-zero (FTZ) и Denormals-are-zero (DAZ). Первый механизм заставляет операции возвращать ноль, как только становится ясно, что результат будет денормализованным. Второй механизм заставляет операции рассматривать поступающие на вход денормализованные числа как нули.
    Ярким примером подобного «отсечения» денормализованных чисел могут послужить видеокарты, в которых резкое падение скорости вычислений в сотню раз недопустимо. Так же, например, в областях, связанных с обработкой звука, нет нужды в очень маленьких числах, поскольку они представляют столь тихий звук, что его не способно воспринять человеческое ухо.

    В версии стандарта IEEE 754-2008 денормализованные числа (denormal или denormalized numbers) были переименованы в subnormal numbers, то есть в числа, меньшие «нормальных». Поэтому их иногда еще называют «субнормальными«.

    Действия с числами с плавающей запятой [ править ]

    Умножение и деление [ править ]

    Самыми простыми для восприятия арифметическими операциями над числами с плавающей запятой являются умножение и деление. Для того, чтобы умножить два вещественных числа в нормализованной форме необходимо перемножить их мантиссы, сложить порядки, округлить и нормализовать полученное число.

    Соответственно, чтобы произвести деление нужно разделить мантиссу делимого на мантиссу делителя и вычесть из порядка делимого порядок делителя. Затем точно так же округлить мантиссу результата и привести его к нормализованной форме.

    Сложение и вычитание [ править ]

    Идея метода сложения и вычитания чисел с плавающей точкой заключается в приведении их к одному порядку. Сначала выбирается оптимальный порядок, затем мантиссы обоих чисел представляются в соответствии с новым порядком, затем над ними производится сложение/вычитание, мантисса результата округляется и, если нужно, результат приводится к нормализированной форме. Пример:

    Алгоритм получения представления вещественного числа в памяти ЭВМ [ править ]

    Покажем преобразование действительного числа для представления его в памяти ЭВМ на примере величины типа Double.

    Как видно из таблицы, величина этого типа занимает в памяти [math]8[/math] байт. На рисунке ниже показано, как здесь представлены поля мантиссы и порядка (нумерация битов осуществляется справа налево):

    Знак Смещённый порядок Мантисса
    63 62..52 51..0

    Можно заметить, что старший бит, отведенный под мантиссу, имеет номер [math]51[/math] , т.е. мантисса занимает младшие [math]52[/math] бита. Черта указывает здесь на положение двоичной запятой. Перед запятой должен стоять бит целой части мантиссы, но поскольку она всегда равна [math]1[/math] , здесь данный бит не требуется и соответствующий разряд отсутствует в памяти (но он подразумевается). Значение порядка хранится здесь не как целое число, представленное в дополнительном коде. Для упрощения вычислений и сравнения действительных чисел значение порядка в ЭВМ хранится в виде смещенного числа, т.е. к настоящему значению порядка перед записью его в память прибавляется смещение. Смещение выбирается так, чтобы минимальному значению порядка соответствовал нуль. Например, для типа Double порядок занимает [math]11[/math] бит и имеет диапазон от [math]2[/math] [math]-1023[/math] до [math]2[/math] [math]1023[/math] , поэтому смещение равно [math]1023[/math] ( [math]10[/math] ) [math]=[/math] [math]1111111111[/math] ( [math]2[/math] ). Наконец, бит с номером [math]63[/math] указывает на знак числа.

    Таким образом, из вышесказанного вытекает следующий алгоритм для получения представления действительного числа в памяти ЭВМ:

    1. перевести модуль данного числа в двоичную систему счисления;
    2. нормализовать двоичное число, т.е. записать в виде M [math] \times [/math] 2 p , где M — мантисса (ее целая часть равна [math]1[/math] ( [math]2[/math] )) и p — порядок, записанный в десятичной системе счисления;
    3. прибавить к порядку смещение и перевести смещенный порядок в двоичную систему счисления;
    4. учитывая знак заданного числа (0 — положительное; 1 — отрицательное), выписать его представление в памяти ЭВМ.

    Пример. Запишем код числа [math]-312[/math] , [math]3125[/math] .

    1. Двоичная запись модуля этого числа имеет вид [math]100111000<,>0101[/math] .
    2. Имеем [math]100111000<,>0101[/math] [math]=[/math] [math]1<,>001110000101[/math] [math]\times[/math] [math]2[/math] [math]8[/math] .
    3. Получаем смещенный порядок [math]8[/math] [math]+[/math] [math]1023[/math] [math]=[/math] [math]1031[/math] . Далее имеем [math]1031[/math] ( [math]10[/math] ) [math]=[/math] [math]10000000111[/math] ( [math]2[/math] ).
    4. Окончательно
      1 10000000111 0011100001010000000000000000000000000000000000000000
      63 62..52 51..0

    Очевидно, что более компактно полученный код стоит записать следующим образом: C073850000000000(16).

    Другой пример иллюстрирует обратный переход от кода действительного числа к самому числу.

    Пример. Пусть дан код 3FEC600000000000(16) или

      0 01111111110 1100011000000000000000000000000000000000000000000000
      63 62..52 51..0
  • Прежде всего замечаем, что это код положительного числа, поскольку в разряде с номером [math]63[/math] записан нуль. Получим порядок этого числа: [math]01111111110[/math] ( [math]2[/math] ) [math]=[/math] [math]1022[/math] ( [math]10[/math] ); [math]1022[/math] [math]-[/math] [math]1023[/math] [math]=[/math] [math]-1[/math] .
  • Число имеет вид [math]1[/math] , [math]1100011[/math] [math] \times [/math] [math]2[/math] [math]-1[/math] или [math]0[/math] , [math]11100011[/math] .
  • Переводом в десятичную систему счисления получаем [math]0[/math] , [math]88671875[/math] .

    Источник

    Читайте также:  Заверила меня что значит
  • Оцените статью