Как отделяется в mathcad в десятичной дроби дробная часть от целой
Перейти к содержимому

Как отделяется в mathcad в десятичной дроби дробная часть от целой

  • автор:

Десятичные дроби

— дробь, знаменатель которого 10 n , где n — натуральное число.

Записан десятичная дробь читается согласно схемы

1 2 3 4 , 5 6 7 8
тысячи сотни десятки единицы десятые сотые тысячные десятитысячные

Например десятичная дробь 10,436 читается «десять целых четыреста тридцать шесть тысячных».

Среди дробей наиболее часто употребляемыми в повседневной жизни есть дроби со знаменателями 10, 100, 1000 и т.д.

Например, 10 г кг,

1мм см,

2см 5мм см и т.д.

Числа со знаменателями 10, 100, 1000 и т. д. договорились записывать без знаменателя.
Сначала пишут целую часть, а потом числитель дробной части. Целую часть отделяют от дробной части запятой.

Например, вместо пишут (читают: «2 целых и 5 десятых»).

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

Если дробь правильная, то перед запятой пишут цифру 0.
Например, вместо пишут (читают: «0 целых и 33 тысячная»).

Обрати внимание! После запятой числитель дробной части должен иметь столько же цифр, сколько нулей в знаменателе.

Таблица разрядов десятичных дробей

Десятичная дробь, как и любое число, состоит из цифр (0,1,2,3,4,5,6,7,8,9).

Место каждой цифры в числе важное: оно определяет разряд числа.

Десятичная дробь состоит из целой части (все цифры до запятой) и дробной части (все цифры после запятой).

Целую часть десятичной дроби можно разбить на разряды также, как и натуральные числа: единицы, десятки, сотни, тысячи и т. д.

Дробная часть десятичной дроби разбивают на разряды так: десятые (в знаменателе обыкновенной дроби 10), сотые (десятые (в знаменателе обыкновенной дроби 100), тысячные (десятые (в знаменателе обыкновенной дроби 1000) и т.д.

Таблицу разрядов можно дополнить любым нужным количеством столбцов.

  1. 1-й разряд после запятой — разряд десятых,
  2. 2-й разряд после запятой — разряд сотых,
  3. 3-й разряд после запятой — разряд тысячных,
  4. 4-й разряд после запятой — разряд десятитысячных,
  5. 5-й разряд после запятой — разряд стотысячных,
  6. 6-й разряд после запятой — разряд миллионных,
  7. 7-й разряд после запятой — разряд десятимиллионным,
  8. 8-й разряд после запятой — разряд стомільйонних.

Сложение и вычитание десятичных дробей

Чтобы добавить или вычесть десятичные дроби, нужно:

  1. Уравнять в этих дробях количество знаков после запятой;
  2. Записать их друг под другом так, чтобы запятая была записана под запятой;
  3. Выполнить сложение (вычитание), не обращая внимания на запятую;
  4. Поставить в ответе запятую под запятой в данных дробях.

Свойства сложения для десятичных дробей:

a + b = b + a — переставная свойство

(a + b) + c = a + ( b + c ) — связующее свойство

Умножение десятичных дробей

Чтобы перемножить две десятичные дроби, надо:
1. выполнить умножение, не обращая внимания на запятые;
2. отделить запятой столько цифр справа, сколько их после запятой в обоих множителях вместе.

Подробнее читайте здесь

Деление десятичных дробей

Чтобы поделить десятичную дробь на натуральное число, надо:
1. разделить дробь на это число, не обращая внимания на запятую;
2. поставить в частном запятую, когда закончится делення целой части.

Подробнее читайте здесь

Сравнение десятичных дробей

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

Сравним две десятичные дроби 0,642 и 0,65. Уравняем число десятичных знаков, приписав к числу 0,65 дело ноль. Получим дроби 0,564 и 0,650.

Из двух дробей с одинаковыми знаменателями, больше то дробь, который имеет больший числитель.
Так как , то , а следовательно,

Десятичные дроби можно сравнивать и по разрядам.

В десятичных дробях 26,63 и 6,553 достаточно сравнить целые части. Так как , то и ;.

Конечные и бесконечные десятичные дроби

Определение: называется дробь, который содержит конечную количество цифр после запятой.

Определение: называется дробь, который не содержит конечной количества цифр после запятой.

Определение: (периодическим дробью) называется бесконечный дробь, в конце содержит группу цифр, которые повторяются.

называется группа цифр, которые повторяются. В предыдущем примере-это 89.

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

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

Как отделяется целая часть от дробной в пакете mathcad

Изучение интерфейса интегрированного пакета MathCAD

1. Интегрированные пакеты для инженерных и математических расчетов. Ознакомление с интегрированными пакетами для инженерных расчетов MathCAD, Mathlab, Maple.

2. Изучение интерфейса интегрированного пакета MathCAD. Главное меню и его составные части. Панель инструментов редактирования и работы с текстовыми документами. Кнопки математических инструментов, их палитры и назначение. Поле для выбора программ расчетов, обозначения данных и функций.

3. Выполнение математических операций. Запись оператора присваивания, его отличие от операции равенства. Простые арифметические операции. Операции возведения в степень и вычисление корня. Операции произведения, суммирования, вычисления определенных интегралов.

4. Выполнение операций над матрицами и векторами. Запись условных операций. Задание циклических вычислений. Структурированные данные – вектора и матрицы и их обработка.

5. Решение алгебраических уравнений. Встраиваемые процедуры (методы) обработки данных, решение алгебраических и дифференциальных уравнений. Построение графиков.

Ознакомление с интегрированными пакетами для инженерных расчетов MathCAD, Mathlab, Maple.

В настоящее время появились хорошо работающие системы такие как Maple, Mathematica, Mathcad, Matlab и некоторые другие. Все упомянутые выше системы, так же как и большинство неупомянутых, являются весьма дружественными по отношению к пользователю. Конечно же и синтаксис языка пользователя у них различный, и библиотеки доступных функций могут меняться от нескольких сотен до тысяч, и внутренние структуры и даже используемые алгоритмы значительно отличаются друг от друга, но все они обладают общими свойствами. Таких принципиальных общих свойств значительно больше, чем различий и, таким образом, после освоения одной из систем компьютерной алгебры переход к другой системе не является сложной проблемой.

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

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

Подобно упомянутым выше пакетам, пакет Matlab фактически представляет собой своеобразный язык программирования высокого уровня, ориентированный на решение научных задач. Характерной особенностью пакета является то, что он позволяет сохранять документы в формате языка программирования С.

Пакет Mathcad популярен, пожалуй, более в инженерной, чем в научной среде. Характерной особенностью пакета является использование привычных стандартных математических обозначений, то есть документ на экране выглядит точно так же обычный математический расчет. Для использования пакета не требуется изучать какую-либо систему команд, как, например, в случае пакетов Mathematica или Maple. Пакет ориен­тирован в первую очередь на проведение численных расчетов, но имеет встроенный символический процессор Maple, что позволяет выполнять аналитические преобразования. В последних версиях предусмотрена возможность создавать связки документов Mathcad с документами Matlab. В отличие от упомянутых выше пакетов, Mathcad является средой ви­зуального программирования, то есть не требует знания специфического набора команд. Простота освоения пакета, дружественный интерфейс, относительная непритязательность к возможностям компьютера явились главными причинами того, что именно этот пакет был выбран для обу­чения студентов численным методам.

Изучение интерфейса интегрированного пакета MathCAD

Вход в систему Маткад можно произвести двумя способами. Если после входа в систему Windows на рабочем столе имеется пиктограмма в виде кольца с буквой М или номера версии типа14 и надписи Mathcad, то надо дважды щѐлкнуть по ней левой кнопкой мыши. Если пиктограммы Маткада нет, то через кнопку «Пуск» в левом нижнем углу экрана следует подняться по всплывшему главному меню до слова «Программы». Далее перейти на правое меню, найти в нем слово MathSoft Apps и через него выйти на пиктограммы Mathcad с номерами версии, нажатием на которые обеспечится загрузка Маткада.

Вид экрана Маткада с программой (будем рассматривать русскую версию, английскую версию можно найти в литературе) представлен на рис. 1.1. Программу с результатом вычислений часто называют документом.

1-я строка —заголовок: Mathcad – [Имя файла]; если файл не создан, то вместо имени будет обозначено [Untitled] или [Без названия] ;

2-я строка— главное меню: Файл, Редактирование, Вид, Вставка, Формат, Математика, Символика, Окно, Помощь. Математические инструменты Маткада (9 кнопок) у нас

вынесены в 4-уюстроку, хотя они могут быть и в конце3-йстроки. Пункт Математика позволяет настроить режим точности вычислений. Рекомендуется в начале работы с системой через пункт Файл и подпункт “Сохранить как” дать имя файлу, в котором будете сохранять свой рабочий документ по мере его разработки;

3-я строка— панель инструментов работы с файлами, в основном аналогичная панели Word’a. При работе может потребоваться воспользоваться кнопкойf(x), которая хранит список обозначений всех функций Маткада. Рекомендуется в процессе работы периодически запоминать с помощью кнопки «Сохранить» (кнопкой клавиатуры F2) текущий вариант своего задания (это исключит исчезновение проделанной работы в случае зависания компьютера);

4-я строка– панель математических инструментов Маткада,

нажатием на которые можно раскрыть имеющиеся инструменты (на рис. раскрыты 7 палитр). Поясним некоторые палитры.

Арифметика (Calculator), Графика (Graph), Векторы и матрицы (Matrix), Преобразования (Evaluation), Математический анализ (Calculus), Логические операции (Boolean), Программирование (Programming), Греческий алфавит (Greek), Символьные преобразования (Symbolic). Эти кнопки раскрываются в палитры (панели) знаков математических операций, вид знаков основных палитр дан на рис. 1.2;

5-я строка– инструменты установки шрифтов, их размера, стиля и расположения в строках, полностью аналогичные Word’у;

6-я полоса примерно из 20 строк —рабочее поле системы, в котором набирается программа и получается решение. Поле первоначально является чистым, а после ввода заголовков, комментариев, формул и математических выражений и получения результатов математических операций оно превращается в рабочий документ.В нижней части рабочего поля находится горизонтальная линия прокрутки, а справа от нее – вертикальная линия прокрутки. Линии прокрутки с помощью стрелок или ползунков позволяют сдвигать кадры и просматривать рабочие тексты, которые полностью не умещаются на экране;

7-я строка —отображает текущий состав вызванных файлов системы Windows (панель задач, с которыми работает пользователь в текущем сеансе) и позволяет простым нажатием на соответствующее имя файла менять на экране различные рабочие программы. В левом нижнем углу строки имеется кнопка “Пуск” (вызова главного меню Windows), через которую делается вход в программы и завершение работы на компьютере.

В правом нижнем углу (панели индикации) имеется значок рабочего языка (Русский-Ru/En-Английский),нажатием на этот символ вызывается меню для выбора языка (смену языка можно получить и совместным нажатием на клавиатуре левых клавиш Alt и Shift или Ctrl и Shift). Обратите внимание, в именах Маткада строчные и прописные буквы, а также одинаковые по написанию буквы русского, латинского и греческого алфавитов воспринимаются как разные символы.

Рассмотрим конкретные примеры программ, разбор которых существенно упростит выполнение контрольных заданий.

Панель инструментов Маткада

Основные кнопки стандартной панели инструментов (1-яполовина3-йстроки на рис. 1.1), которые наиболее часто используются при работе с Маткадом, и вызываемым этими кнопками командам:

Создать(new) – очистка рабочего поля для нового рабочего документа;

Открыть(open)–вызватьранее сохраненный файл на экран;

Сохранить(save) – сохранение в файле копии текущего рабочего листа;

Печать(print) – печать рабочего документа (надо знать, к какому принтеру подключен компьютер и есть ли в нем бумага);

Вырезать(cut) – вырезание из документа выделенного объекта и помещение его в буфер обмена;

Копировать(copy) – копирование выделенного объекта в буфер;

Вставить(paste) – вставить в документ содержимое буфера обмена.

Специфической для Маткада кнопкой в этой строке является кнопка f(x) — вставка встроенной функции в документ. Открывая левой кнопкой мыши эту кнопку, получим панель с двумя списками: перечень категорий функций (тригонометрические, статистические и др.) и перечень наименований функций, входящих в выбранную категорию. Функции можно просто просмотреть или выбрать нужную функцию и нажатием кнопки мыши скопировать еѐ на место курсора в рабочем поле.

Особое внимание следует уделить математической панели инструментов (4-ястрока рис. 1.2). Последовательно открывая (левой кнопкой мыши) 6 первых кнопок этой панели, вызвать в рабочее окно соответствующие им палитры математических знаков и символических схем (остальные 3 палитры в данной работе пока не потребуются). Выбранные палитры разместить за вертикальной штриховой линией вдоль правой границы экрана, чтобы не занимать основное рабочее поле. Познакомиться с основными математическими символами, расположенными на них. Нажатием на кнопку мыши эти знаки можно копировать на место курсора.

Ввод текстов

Порядок набора текста.После ввода курсора в рабочее поле он превращается в красный крестик. При наборе текста (названия программы) текстовый блок выделяется черной рамкой. Это означает, что система перешла в режим работы текстового редактора. Более простой способ входа в текстовый редактор – нажать на клавишу двойных кавычек (“).

-Переключить в нижней строке состояния алфавит с английского на русский и выбрать в окне панели инструментов, например, шрифт Arial Cyr (кириллица). После выполнения этих операций текстовый редактор будет готов для ввода текста на русском языке.

-Набрать с клавиатуры текст, аналогичный приведенному на рис. 1.1, но с указанием своих данных (фамилия и шифр).

При наборе текста текстовая область расширяется (слева-направо),а при нажатии клавиши Enter курсор переходит на другую строку текста. По окончании набора текста необходимо щелкнуть левой кнопкой мыши по свободному месту рабочего листа.

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

Работа с формульным редактором.При работе с формульным редактором необходимо различать знаки: присваивания (:=) и равенства (=). Знак присваивания используется при присвоении константам числовых значений, а переменным и функциям – формульных зависимостей. Знак равенства используется для вывода численных значений, введенных или полученных в результате расчетов, переменных, матриц или функций.

Эти знаки можно вызвать с математической панели инструментов (Вычисления или

Преобразования на рис. 1.2.). Знак равенства можно просто ввести с клавиатуры (=), а знак присваивания – совместным нажатием клавиш Shift и двоеточие (Shift и :).

При наборе выражений красный крестик превращается в голубой угольник, и область набора обрамляется черным прямоугольником (зоной выражения, при наборе программы зоны разных выражений не должны пересекаться). При наборе следующий символ будет поставлен справа от вертикальной линии угольника, если его горизонтальная линия направлена влево, или слева при еѐ направленности вправо. Если необходимо произвести действия над частью выражения (например, деления или возведения в степень), то нажатием на клавишу «Пробел» добиваются выделения голубым угольником всей еѐ выбранной части. При вырезании или копировании в буфер передается часть выражения, охваченная голубым угольником.

В Маткаде нет знаков препинания, поэтому операторы должны отделяться пробелами. Не рекомендуется набирать программы столбиком. Выражения программы для удобства просмотра целесообразно набирать в строку, но так, чтобы их зоны не накладывались одна на другую. Это надо учитывать и при переходе на другую строку. Обратите внимание, чтобы все данные, используемые в набираемом выражении, были определены ранее (несоблюдение этого приводит к покраснению таких величин). Заметим, что при наборе программы не следует выходить за правую пунктирную границу листа, так как этот материал может быть утерян. Кроме того, горизонтальная пунктирная линия делит документ на листы и не должна проходить через выражения программы.

Маткад позволяет перемещать часть конструкций программ, для чего следует щелкнуть мышкой у правого верхнего элемента и обвести эту часть до получения штриховых границ у ряда элементов, а затем, нажав кнопку мыши (до получения черной ладоши), переместить на

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

Набрать с клавиатуры с использованием знака присваивания (:=) следующие

математические выражения:
A:=5 B:=4 C:=3
х:=-3,-2.5..3 у(х):=sin(x)2 z(x):=cos(x2)

В первой строке присваиваются значения константам А, В, С, а во второй строке заданы диапазон изменения x от –3до 3 с шагом +0,5 и вычисление таблиц функций y(x) и z(x). Диапазон указывается начальным значением(-3),следующим значением, увеличенным на шаг,(-3+0,5)и конечным значением (3). Заметим, что в Маткаде целая часть числа отделяется от дробной точкой. Перед конечным значением ставится специальный знак диапазона в виде двух точек «..»(он вводится нажатием одной клавиши точка с запятой — «или берѐтся из панели инструментов).

Функциональность доступа к MathCad — понятие и виды. Классификация и особенности категории «Функциональность доступа к MathCad» 2015, 2017-2018.

Поскольку большая часть источников информации находится на бумажных носителях, то целесообразно автоматизировать процесс переноса информации с бумажных носителей в базы ресурсов СИЛТ. Рассмотрим этот процесс на примере текстового редактора Microsoft Word. Началом может быть. [читать подробнее].

Текстовую область можно разместить в любом незанятом месте документа Mathcad. Чтобы до начала ввода указать программе, что требуется создать не формульный, а текстовый регион, достаточно, перед тем как ввести первый символ, нажать клавишу » (двойная кавычка). В результате на. [читать подробнее].

Для выполнения программы-функции необходимо обратиться к имени программы-функции с указанием списка фактических параметров (если в описании программы присутствует список формальных параметров), т. е. (список фактических параметров) Фактические. [читать подробнее].

Для набора выражения используются клавиатура и панели инструментов, которые доступны с помощью меню Просмотр\Панели. Например, для расчёта выражения необходимо набрать 1/, затем найти знак корня в панели «Калькулятор». В знаменателе выражения появится шаблон который. [читать подробнее].

Основными инструментами работы в Mathcad являются математические выражения, переменные и функции. Нередко записать формулу, использующую ту или иную внутреннюю логику (например, возвращение различных значений в зависимости от условий), в одну строку не удается. Назначение. [читать подробнее].

Для проведения измерений осциллограф нужно настроить, для чего следует задать: • расположение осей, по которым откладывается сигнал; • нужный масштаб развертки по осям; • смещение начала координат по осям, • режим работы по входу: закрытый или открытый; • режим. [читать подробнее].

Для написания программ в среде MathCad [4,6] существует специальная панель Programmіng (Программирование) (рис.16, а), она относится к панели Math (Математические) (рис.16, б). Язык программирования MathCad имеет предельно малое количество операторов (рис. 16, а). Чтобы написать программу. [читать подробнее].

Применим возможности системы MathCad для расчета переходных процессов звеньев второго порядка. Передаточная функция W(s) звена приведена на рисунке 4.2. Обратное преобразование Лапласа, осуществляемое символьным оператором над изображением W(s)/s , позволяет получить. [читать подробнее].

Пример1. Предположим, вы нашли в учебнике формулу, например, мощности некоего модуля: Nм= . Она состоит из двух частей. В первой — поясняется, из какой формулы она получена, а во второй – приведено то, что осталось после раскрытия переменных и сокращения первой части. Конечно. [читать подробнее].

Чтобы определить переменную, достаточно ввести ее имя и присвоить ей некоторое значение, для чего служит оператор присваивания. 1. Введите в желаемом месте документа имя переменной. 2. Введите оператор присваивания с помощью клавиши или нажатием соответствующей. [читать подробнее].

5. Аналитические преобразования в пакете MathCad

Пакет MathCAD позволяет выполнять целый ряд аналитических (символьных) процедур (symbolic operations), используя инструменты панелей Symbolic (символьные) и Calculus Toolbar (матанализ). К этим операциям относятся:

операции над функциями – вычисление производных (derivate) и неопределенных интегралов (indefinite integrals), разложение функций в степенные ряды (expand to series);

операции над последовательностями – нахождение пределов (limits), вычисление сумм (summation) и произведений (iterated product);

операции над дробями (разложение на простые дроби – convert to partial fractions),

операции над математическими выражениями ­ упрощение (simplify), приведение подобных членов (collect terms)

При записи аналитических соотношений следует использовать знак символьного равенства. Он отображается в тексте документа как  и набирается нажатием клавиш CTRL+или, используя панели Symbolic (символьные) или Evaluation (вычисление). Некоторые примеры аналитических процедур приведены на рис.9, который представляет фрагмент документа MathCAD.

Рис.9. Примеры аналитических (символьных) преобразований в пакете MathCAD

6. Работа с векторами и матрицами в пакете MathCad

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

Упорядоченные совокупности элементов называются матрицами и векторами. Каждая матрица (двумерный массив) и вектор (одномерный массив) имеет свое уникальное имя. Порядковый номер элемента, который является его адресом, называется индексом. Индексы могут иметь только целочисленные значения, начинаясь с нуля или единицы, в соответствии со значением системной переменной ORIGIN (по умолчанию эта переменная равна нулю, но ее можно переопределить в тексте документа для удобства пользователя). Векторы и матрицы можно задавать:

импортируя данные из структурированного внешнего ASCII-файла, используя выражение вида X:=READPRN(«адрес и имя файла»). Последнее часто бывает необходимо при анализе результатов экспериментов, сохраненных в виде упорядоченных многостолбцевых массивов;

«вручную» с заполнением массива пустых полей (для не слишком больших массивов);

с использованием дискретного аргумента, когда имеется некоторая явная зависимость для вычисления элементов через их индексы.

Примеры реализации различных способов ввода отражены на рис. 10-12.

Рис. 10 Ввод матриц в ручном режиме

Рис. 11. Ввод матриц с помощью функций

Для формирования элементов матриц в виде случайных чисел используется функция rnd(a), которая возвращает случайное число равномерно распределенное в интервале (0, а). Поэтому выражение вида rnd(2a) – a будет возвращать случайное число из интервала (–a,a). На рис. 12 приведен пример формирования матрицы случайных чисел.

Рис. 12. Формирование случайной матрицы с помощью функции rnd

Пакет MathCAD позволяет производить алгебраические процедуры с матрицами и преобразовывать их по определенным правилам. Примеры процедур представлены на рис. 13 – 16.

Любое вычисление, которое MathCAD может выполнить с одиночными значениями, он может выполнять также с векторами и матрицами, используя оператор векторизации, который изменяет смысл операций. Например, пусть Q некоторая матрица. Тогда запись exp(Q) или (в средеMathCAD) является некорректной, так как аргументом функции exp (или радикал) должна быть простая переменная, а не матрица. Применение к этой функции оператора векторизации приводит к вычислению функции от каждого элемента матрицы и результатом также является матрица. Пример применения операции векторизации представлен на рис. 17.

Если результаты экспериментальных наблюдений или расчетов формируют матрицы, то имеется возможность строить графики (как обычные, так и трехмерные) функций, заданных в виде таблиц. При этом в качестве независимого аргумента (и зависимой переменной) может быть выбран любой из столбцов (или любая из строк) данной матрицы. Пример построения графика приведен в MathCAD документе, приведенном на рис. 18.

Решение уравнений в пакете MathCAD .

Пусть имеется уравнение: f ( x ) = 0. Решение уравнения численными методами состоит из двух этапов: отделение корней, т.е. нахождение таких отрезков [ a,b ] на оси OX, внутри которых имеется один корень; вычисление корней с заданной точностью. Одним из способов отделения корней является графический способ. Рассмотрим его на примере. Пусть требуется отделить корни уравнения 3 – x – ln ( x ) = 0. Перепишем исходное уравнение в виде 3 – x = ln ( x )и построим графики функций y = 3 – x и y = ln ( x )(рис. 19.3). Из чертежа видно, что графики пересекаются в единственной точке, абсцисса которой находится внутри отрезка [1, 3]. Знаки функции на концах отрезка разные: f (1) = 3 – 1 – ln (1) > 0, f(3) = 3 – 3 – ln (3) < 0. Значит, данное уравнение имеет один дей-ствительный корень, лежащий внутри отрезка [1, 3],т. е.a = 1, b = 3. Можно также отделить корни, построив график функции f ( x )в приложении Mathcad или в приложении Excel. После того, как определен отрезок (или отрезки), внутри которого имеется один корень, можно вычислить его с заданной точностью одним из методов.Метод касательных. При использовании данного метода для вычисления корня уравнения необходимо определить начальное приближение корня x0: x0 = a, если знаки f(a) и f ¢¢(a ) совпадают, и x0 = b, если знаки f(b) и f ¢¢(b) совпадают. Последовательные приближения корня рассчитываются по формуле

xn +1 = xn – , n = 0, 1 ,2, ….

xn 1 = xn

5. Если | xn 1 – xn | > e, то переход к пункту 3, в противном случае – переход к п. 6. 6. Вывод значения корня xn 1. Метод дихотомии (деления отрезка пополам).При использовании метода дихотомии отрезок [ a , b ] делится пополам. Из полученных двух отрезков для дальнейших вычислений выбирается тот, на концах которого функция f ( x ) имеет разные знаки. Выбранный отрезок вновь делится пополам. Вычисления продолжаются до тех пор, пока величина последнего из полученных отрезков не станет меньше 2 e. Рассмотрим алгоритм метода дихотомии: 1. Ввод значений a, b, e.

2. Вычисление . 3. Если f ( x ) = 0, то переход к п. 6, иначе – переход к п. 4. 4. Если f ( x ) × f ( a ) 0, то b = x, иначе– a = x. 5. Если | a – b | > 2 e, то переход к п. 2, иначе – переход к следующему пункту. 6. Вывод значения корня x.

Способы решения систем уравнений в пакете MathCAD.

Решить уравнение с помощью Mathcad можно разными способами. С помощью меню . Следует записать уравнение, в котором логический знак равенства (на экране он будет жирным) вводится с панели Логический. Если уравнение приведено к виду f(x) = 0, то можно ввести только левую часть уравнения без знака равенства и нуля. Затем надо выделить в уравнении переменную, относительно которой оно решается, и выполнить Символика/Переменная/Решение. С помощью ключевого слова solve . Надо ввести уравнение и ключевое слово solve с панели Символика, в появившемся местозаполнителе записать имя переменной, относительно которой решается уравнение. Для упрощения сложного решения можно после имени введенной переменной ввести ключевое слово simplify из панели Символика. Ключевые слова при этом отобразятся записанными в столбик.С помощью встроенной функции root . Следует задать начальное приближение корня и записать само уравнение: x := 1 f ( x ) := 3 – x – ln ( x ) Для получения значения корня нужно использовать встроенную функцию: root ( f ( x ), x ) = В приложении Excel можно составить программы по алгоритмам, приведенным выше, на языке VBA и произвести нужные вычисления. Кроме того, для решения уравнения в приложении Excel имеется команда Сервис/Подбор параметра. Чтобы решить уравнение, надо на рабочем листе, например, в ячейке А1 записать начальное приближение корня, в ячейке В1 − само уравнение: = 3 – А1 – Log ( A 1). Выполнить Сервис/Подбор параметра. В появившемся окне задать следующие значения: в поле Установить в ячейке выбрать В1, в поле Значение ввести 0, в поле Изменяя значение ячейкиА1. После нажатия в ячейке А1 будет корень уравнения.

Дата добавления: 2019-02-12 ; просмотров: 152 ; Мы поможем в написании вашей работы!

Похожие публикации:

  1. Как работать с maple
  2. Как редактировать бота в telegram
  3. Как решить систему уравнений в mathcad 15
  4. Как сделать буктрейлер в windows movie maker

Деление десятичных дробей

Вспомним, что такое десятичные дроби, а также как правильно их делить: в столбик и не только. В этом материале будем рассматривать примеры для положительных дробей.

· Обновлено 21 октября 2022

Открыть диалоговое окно с формой по клику

Как разделить десятичную дробь на натуральное число столбиком

Делить столбиком можно не только натуральные числа, но и дроби. Алгоритм мы подробно опишем здесь. Итак, как делить десятичные дроби на натуральные числа в столбик:

1. Добавить к десятичной дроби справа несколько нулей (для деления мы можем добавлять любое их количество, которое нам необходимо).

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

Результатом такого деления может стать как конечная, так и бесконечная периодическая десятичная дробь. Это зависит от остатка: если он нулевой, то результат окажется конечным, а если остатки начнут повторяться — получится периодическая дробь.

Пример: Разделить столбиком

Как решаем

1. Делим столбиком, предварительно дописав два нуля к десятичной дроби.

Пример деления десятичных дробей столбиком, рисунок 1

2. После того, как мы поделили целую часть дроби и получили 16, отделяем ответ запятой (16) и продолжаем деление уже для дробной части

Пример деления десятичных дробей столбиком, рисунок 2

В конце у нас нулевой остаток, значит деление завершено.

Ответ:

Домашний лицей для 5–11 классов

Занятия где и когда удобно, 10+ кружков на выбор, никакого стресса с домашками и нудных родительских собраний

Домашний лицей для 5–11 классов

Как разделить столбиком одну десятичную дробь на другую

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

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

2. После этого делим дробь столбиком на получившееся натуральное число.

Пример: поделить столбиком 63,42 на 2,1

Как решаем

Переносим запятую на один знак вправо, чтобы делитель (2,1) стало натуральным числом. Запятую переносим в обоих числах — у нас получается 634,2÷21.

Затем производим деление:

Пример деления десятичных дробей столбиком, рисунок 3

Ответ:

Выберите идеального репетитора по математике
15 000+ проверенных преподавателей со средним рейтингом 4,8. Учтём ваш график и цель обучения

Выберите идеального репетитора по математике

Как разделить десятичные дроби на 1000, 100, 10 и другие

Как вы уже заметили, есть основное правило деления десятичных дробей: по нему деление дроби на десятки, сотни, тысячи аналогично ее умножению на 1/1000, 1/100, 1/10 и другие.

Чтобы выполнить действие, нужно просто перенести запятую влево на нужное количество цифр (равное нулям). Если значений в числе не хватит для переноса, нужно дописать справа нужное количество нулей:

Как разделить десятичные дроби на 0,001, 0,01, 0,1 и другие

Правило из предыдущего пункта поможет нам без труда разделить дроби на указанные значения. Переводим эти числа в стандартные дроби и затем при делении действие будет аналогично умножению на 1000, 100, 10 (так как дробь, на которую делим переворачивается).

Чтобы найти ответ в подобных задачах, мы переносим запятую на одну, две, три цифры вправо (в зависимости от числа, на которое делим) и дописываем нули, если цифр в числе окажется недостаточно.

Как разделить смешанное число или обыкновенную дробь на десятичную и наоборот

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

Всё, точка, приплыли! Учимся работать с числами с плавающей точкой и разрабатываем альтернативу с фиксированной точностью десятичной дроби

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

Куда уплывает точка

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

Мантисса — это, по сути, число, записанное без точки. Экспонента — это степень, в которую нужно возвести некое число N (как правило, N = 2), чтобы при перемножении на мантиссу получить искомое число (с точностью до разрядности мантиссы). Выглядит это примерно так:

x = m * N ^ e, где m и e — целые числа, записанные в бинарном виде в выделенных под них битах. 

Мантисса — это, по сути, число, записанное без точки. Экспонента — это степень, в которую нужно возвести некое число N (как правило, N = 2), чтобы при перемножении на мантиссу получить искомое число

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

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

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

Стандарт точечного плаванья

Вещественные числа с плавающей точкой, поддержанные на уровне процессора, описаны специальным международным стандартом IEEE 754. Основными двумя типами для любых вычислений являются single-precision (одинарной точности) и double-precision (двойной точности) floating-point (числа с плавающей точкой). Названия эти напрямую отражают разрядность бинарного представления чисел одинарной и двойной точности: под представление с одинарной точностью выделено 32 бита, а под двойную, как ни странно, 64 бита — ровно вдвое больше.

Кроме одинарной и двойной точности, в новой редакции стандарта IEEE 754—2008 предусмотрены также типы расширенной точности, четверной и даже половинной точности. Однако в C/C++, кроме float и double, есть разве что еще тип long double, упорно не поддерживаемый компанией Microsoft, которая в Visual C++ подставляет вместо него обычный double. Ядром процессора в настоящий момент также, как правило, пока не поддерживаются типы половинной и четверной точности. Поэтому, выбирая представления с плавающей точкой, приходится выбирать лишь из float и double.

В качестве основания для экспоненты числа по стандарту берется 2, соответственно, приведенная выше формула сводится к следующей:

x = m * (2 ^ e), где 1  

Расклад в битах в числах одинарной точности выглядит так:

| 1 бит под знак | 8 бит экспоненты | 23 бита мантиссы |

Для двойной точности мы можем использовать больше битов:

| 1 бит под знак | 11 бит экспоненты | 52 бита мантиссы |

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

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

Мантисса записывается в двоичном виде, и отбрасывается целая часть, заведомо равная 1, поэтому никогда не забываем, что мантисса на один бит длиннее, чем в она хранится в двоичном виде

Не нужно иметь докторскую степень, чтобы вычислить точность в десятичных знаках чисел, которые можно представить этим стандартом: 2^(23 + 1) = 16 777 216; это явно указывает нам на тот факт, что точность представления вещественных чисел с одинарной точностью достигает чуть более семи десятичных знаков. Это значит, что мы не сможем сохранить в данном формате, например, число 123 456,78 — небольшое, в общем-то, число, но уже начиная с сотой доли мы получим не то число, что хотели. Ситуация усложняется тем, что для больших чисел вида 1 234 567 890, которое прекрасно помещается даже в 32-разрядное целое, мы получим погрешность уже в сотнях единиц! Поэтому, например, в C++ для вещественных чисел по умолчанию используется тип double. Мантисса числа с двойной точностью уже превышает 15 знаков: 2^52> = 4 503 599 627 370 496 и спокойно вмещает в себя все 32-разрядные целые, давая сбой только на действительно больших 64-разрядных целых (19 десятичных знаков), где погрешность в сотнях единиц уже, как правило, несущественна. Если же нужна большая точность, то мы в данной статье обязательно в этом поможем.

Теперь что касается экспоненты. Это обычное бинарное представление целого числа, в которое нужно возвести 10, чтобы при перемножении на мантиссу в нормализованном виде получить исходное число. Вот только в стандарте вдобавок ввели смещение, которое нужно вычитать из бинарного представления, чтобы получить искомую степень десятки (так называемая biased exponent — смещенная экспонента). Экспонента смещается для упрощения операции сравнения, то есть для одинарной точности берется значение 127, а для двойной 1023. Все это звучит крайне сложно, поэтому многие пропускают главу о типе с плавающей точкой. А зря!

Примерное плаванье

Чтобы стало чуточку понятнее, рассмотрим пример. Закодируем число 640 (= 512 + 128) в бинарном виде как вещественное число одинарной точности:

  • число положительное — бит знака будет равен 0;
  • чтобы получить нормализованную мантиссу, нам нужно поделить число на 512 — максимальную степень двойки, меньшую числа, получим 640 / 512 = 512 / 512 + 128 / 512 или 1 + 1/4, что дает в двоичной записи 1,01, соответственно, в битах мантисы будет 0100000 00000000 00000000;
  • чтобы получить из 1 + 1/4 снова 640, нам нужно указать экспоненту, равную 9, как раз 2^9 = 512, число, на которое мы поделили число при нормализации мантиссы, но в бинарном виде должно быть представление в смещенном виде, и для вещественных чисел одинарной точности нужно прибавить 127, получим 127 + 9 = 128 + 8, что в бинарном виде будет записано так: 10001000.

Задание на дом: разобраться в двоичной записи следующих констант: плюс и минус бесконечность (INF — бесконечность), ноль, минус ноль и число-не-число (NaN — not-a-number).

За буйки не заплывай!

Есть одно важное правило: у каждого формата представления числа есть свои пределы, за которые заплывать нельзя. Причем обеспечивать невыход за эти пределы приходится самому программисту, ведь поведение программы на С/С++ — это сделать невозмутимое лицо при выдаче в качестве сложения двух больших положительных целых чисел маленькое отрицательное. Но если для целых чисел нужно учитывать только максимальное и минимальное значение, то для вещественных чисел в представлении с плавающей точкой следует больше внимания обращать не столько на максимальные значения, сколько на разрядность числа. Благодаря экспоненте максимальное число для представления с плавающей точкой при двойной точности превышает 10 308 , даже экспонента одинарной точности дает возможность кодировать числа свыше 10 38 . Если сравнить с «жалкими» 10 19 , максимумом для 64-битных целых чисел, можно сделать вывод, что максимальные и минимальные значения вряд ли когда-либо придется учитывать, хотя и забывать про них не стоит.

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

Другое дело проблема точности. Жалкие 23 бита под мантиссу дают погрешность уже на 8-м знаке после запятой. Для чисел с двойной точностью ситуация не столь плачевная, но и 15 десятичных знаков очень быстро превращаются в проблему, если, например, при обработке данных требуется 6 фиксированных знаков после точки, а числа до точки достаточно большие, под них остается всего лишь 9 знаков. Соответственно, любые многомиллиардные суммы будут давать значительную погрешность в дробной части. При большой интенсивности обработки таких чисел могут пропадать миллиарды евро, просто потому, что они «не поместились», а погрешность дробной части суммировалась и накопила огромный остаток неучтенных данных.

Если бы это была только теория! На практике не должно пропадать даже тысячной доли цента, погрешность всех операций должна быть строго равна нулю. Поэтому для бизнес-логики, как правило, не используют C/C++, а берут C# или Python, где в стандартной библиотеке уже встроен тип Decimal, обрабатывающий десятичные дроби с нулевой погрешностью при указанной точности в десятичных знаках после запятой. Что же делать нам, программистам на C++, если перед нами стоит задача обработать числа очень большой разрядности, при этом не используя высокоуровневые языки программирования? Да то же, что и обычно: заполнить пробел, создав один небольшой тип данных для работы с десятичными дробями высокой точности, аналогичный типам Decimal высокоуровневых библиотек.

Добавим плавающей точке цемента

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

Сегодня в учебных целях мы рассмотрим, как создать представление вещественных чисел с гарантированной точностью до 18 знаков после точки. Это достигается простым комбинированием двух 64-разрядных целых для целой и дробной части соответственно. В принципе, никто не мешает вместо одного числа для каждой из компонент взять массив значений и получить полноценную «длинную» арифметику. Но будет более чем достаточно сейчас решить проблему точности, дав возможность работать с точностью по 18 знаков до и после запятой, зафиксировав точку между двумя этими значениями и залив ее цементом.

Отсыпь и мне децимала!

Сначала немного теории. Обозначим наше две компоненты, целую и дробную часть числа, как n и f, а само число будет представимо в виде

x = n + f * 10 -18 , где n, f — целые, 0

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

class decimal < … private: int64_t m_integral; uint64_t m_fractional; >; 

Целая часть в данном случае — максимальное целое, меньшее представляемого числа, дробная часть — результат вычитания из этого числа его целой части, помноженной на 10 18 , и приведенное к целому: f = (x – n) * 10 18 .

Целая часть для отрицательных чисел получится большей по модулю самого числа, а дробная часть будет не совпадать с десятичной записью самого числа, например для числа –1,67 компонентами будут: n = –2 и f = 0,33 * 10 18 . Зато такая запись позволяет упростить и ускорить алгоритмы сложения и умножения, поскольку не нужно ветвления для отрицательных чисел.

Операции с типом десятичной дроби

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

x = a + b * 1e-18, y = c + d * 1e-18, z = x + y = e + f * 1e-18, a, c, e: int64_t; b, d ,f: uint64_t; 0 * 1e+18 

NB: здесь и далее все записи в форме 1e — целые числа.

Здесь [n] — это получение целой части числа, а — получение дробной части. Все бы хорошо, но вспоминаем про ограничение целых чисел. Значение 1e+18 уже близко к грани значений беззнакового 64-битового целого типа uint64_t (потому мы его и выбрали), но нам никто не мешает чуточку упростить выражение, чтобы гарантированно оставаться в границах типа, исходя из начальных условий:

e = a + c + (b + d) div 1e+18, f = (b + d) mod 1e+18. 

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

e = a + c; f = b + d; if (f >= 1e+18) f -= 1e+18, ++e; 

Здесь опущены проверки на максимальное целое для значения e для простоты изложения.

Для вычитания все чуть-чуть сложнее, здесь уже нужно учитывать переход ниже нуля для беззнакового целого. То есть нужно сравнить два числа до вычитания.

e = a - c; if (b >= d) f = b - d; else f = (1e+18 - d) + b, --e; 

В целом все пока несложно. До умножения и деления все всегда несложно.

Умножение чисел с фиксированной точностью

Рассмотрим сперва умножение. Поскольку числа в дробной части довольно большие и, как правило, находятся в ближайшей окрестности 1e+18, нам придется либо использовать язык ассемблера и операции с Q-регистрами, либо пока обойтись целыми числами, побив каждую компоненту на две части по 1e+9. В этом случае умножение будет давать не больше 1e+18 и ассемблер нам пока не понадобится, будет не так шустро, но нам хватит 64-разрядного целого, и мы останемся внутри C++. Ты помнишь школу и умножение столбиком? Если нет, самое время вспомнить:

Введем матрицу для упрощения вычисления умножения:

Матрица вводится не столько для удобства вычисления, сколько для удобства проверки. Ведь A11 = a1 * c1 должно быть строго меньше MAX_INT64 / 10 18 , а значения диагональю ниже: A12 = a1 * c2 и A21 = a2 * c1 должны быть строго меньше MAX_INT64 / 109. Просто потому, что мы будем умножать на эти коэффициэнты при сложении компонент:

Здесь мы опускаем слагаемое A44 div 10 18 просто потому, что оно равно нулю. Разумеется, перед каждым сложением стоит проверить, не выйдем ли мы за пределы MAX_INT64. К счастью, мы можем оперировать беззнаковым типом uint64_t для всех компонент матрицы и для промежуточного результата. Все, что нужно будет сделать в конце, — это определить знак результата se = sa xor sc и для отрицательного числа поправить целую и дробную часть: целую уменьшить на единицу, дробную вычесть из единицы. Вот, в общем, и все умножение, главное — быть очень аккуратным. С ассемблером все на порядок проще, но этот материал выходит за рамки Академии C++.

Алгоритм деления без регистрации и СМС

Если ты помнишь алгоритм деления столбиком — молодец, но здесь он будет не нужен. Благодаря математике и небольшому колдовству с неравенствами нам будет проще посчитать обратное число x –1 и выполнить умножение на x –1 . Итак, решаем задачу

y = x -1 = 1 / (a + b * 10 -18 ) = c + d * 10 -18 .

Для упрощения рассмотрим нахождение обратного числа для положительного x. Если хотя бы одна из компонент x равна нулю (но не обе сразу), вычисления сильно упрощаются. Если a = 0, то:

y = 1 / (b * 1e-18) = 1e+18 / b, e = 1e+18 div b, f = 1e+18 mod b; если b = 0, a = 1, то y = e = 1, f = 0; ecли b = 0, a > 1, то: y = 1 / a, e = 0, f = 1e+18 div a. 

Для более общего случая, когда x содержит ненулевые дробную и целую части, в этом случае уравнение сводится к следующему:

если a > 1, b != 0 то: y = 1 / (a + b * 1e-18) < 1, отсюда e = 0, f = 1e+18 / (a + b * 1e-18). 

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

k = max(k): 1e+k 

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

Очень полезно будет завести массив степеней десяток от 0 до 18 включительно, поскольку вычислять их совершенно излишне, мы их знаем заранее и требоваться они нам будут часто.

Преобразования типов

Мы знаем и умеем достаточно, чтобы теперь превратить расплывчатые float и double в наш новенький decimal.

decimal::decimal(double value) : m_integral(static_cast(std::floor(value)) m_fractional(static_cast(std::floor( (value - m_integral) * 1e+18 + 0.5)) < normalize(); >void decimal::normalize() < uint64_t tail = m_fractional % 1e+3; if (tail) < if (tail >103/2) m_fractional += 1e+3 - tail; else m_fractional -= tail; > > 

Здесь 103 является, по сути, той погрешностью, за которой double перестает быть точным. При желании погрешность можно еще уменьшить, здесь 10 18-15 нужно для наглядности изложения. Нормализация после преобразования нужна будет все равно, поскольку точно double заведомо ниже даже дробной части decimal. Кроме того, нужно учитывать случай, когда double выходит за пределы int64_t, при таких условиях наш decimal не сможет правильно преобразовать целую часть числа.

Для float все выглядит похожим образом, но погрешность на порядок выше: 10 18-7 = 10 11 .

Все целые числа преобразовываются в decimal без проблем, просто инициализируя поле m_integral. Преобразование в обратную сторону для целых чисел также будет просто возврат m_integral, можно добавить округление m_fractional.

Преобразование из decimal в double и float сводится к вышеуказанной формуле:

return m_integral + m_fractional * 1e-18; 

Отдельно стоит рассмотреть преобразование в строку и из строки. Целочисленная часть, по сути, преобразуется в строку как есть, после этого остается только вставить decimal separator и вывести дробную часть как целое, отбросив завершающие нули. Также можно ввести поле «точность» m_precision и записывать в строку лишь указанное в нем число десятичных знаков.

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

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

GITHUB

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

Не уплывай, и точка!

В заключение скажу лишь то, что подобный тип в C/C++ может появиться в весьма специфической задаче. Как правило, проблемы чисел с большой точностью решаются языками типа Python или C#, но если уж понадобилось по 15–18 знаков до запятой и после, то смело используй данный тип.

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

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

image

Впервые опубликовано в журнале Хакер #192.
Автор: Владимир Qualab Керимов, ведущий С++ разработчик компании Parallels

  • Материалы сайта
  • Бумажный вариант
  • «Хакер» на iOS/iPad
  • «Хакер» на Android
  • c++
  • числа с плавающей точкой

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *