Лекция
Это продолжение увлекательной статьи про округление чисел.
...
text-align:center">СД
Наиболее распространенным типом округления является округление до целого числа или, в более общем смысле, до целого числа, кратного некоторому приращению, например, округление до целых десятых долей секунды, сотых долей доллара, до целых кратных 1/2 или 1/8 дюйма, до целых десятков или тысяч и т. д.
В общем случае округление числа x до кратного некоторому указанному положительному значению m включает в себя следующие шаги:
готынгТоМтылтяпле(х,м)=готынг(х/м)×м
Например, округление x = 2,1784 доллара до целых центов (т. е. до кратного 0,01) влечет за собой вычисление 2,1784 / 0,01 = 217,84 , затем округление этого числа до 218 и, наконец, вычисление 218 × 0,01 = 2,18 .
При округлении до заданного количества значащих цифр приращение m зависит от величины округляемого числа (или округленного результата).
Приращение m обычно представляет собой конечную дробь в любой системе счисления , используемой для представления чисел. Для отображения людям это обычно означает десятичную систему счисления (то есть m — это целое число, умноженное на степень 10, например, 1/1000 или 25/100). Для промежуточных значений, хранящихся в цифровых компьютерах, это часто означает двоичную систему счисления ( m — это целое число, умноженное на степень 2).
Абстрактная одноаргументная функция "round()", возвращающая целое число из произвольного вещественного значения, имеет по крайней мере дюжину различных конкретных определений, представленных в разделе округления до целого числа . Абстрактная двухаргументная функция "roundToMultiple()" формально определена здесь, но во многих случаях она используется с неявным значением m = 1 для приращения, а затем сводится к эквивалентной абстрактной одноаргументной функции, также с той же дюжиной различных конкретных определений.
Округление до определенной степени сильно отличается от округления до определенного кратного ; например, в вычислениях часто возникает необходимость округлить число до целой степени 2. В общем случае для округления положительного числа x до степени некоторого положительного числа b, отличного от 1, необходимо выполнить следующие шаги:
Многие из оговорок, применимых к округлению до кратного числа, применимы и к округлению до степени.
Этот тип округления, который также называется округлением до логарифмической шкалы , является вариантом округления до указанной степени . Округление по логарифмической шкале осуществляется путем взятия логарифма суммы и выполнения обычного округления до ближайшего значения по логарифмической шкале.
Например, резисторы поставляются с предпочтительными числами в логарифмическом масштабе. В частности, для резисторов с точностью 10% они поставляются с номинальными значениями 100, 120, 150, 180, 220 и т. д., округленными до кратных 10 ( серия E12 ). Если расчет показывает, что требуется резистор сопротивлением 165 Ом, то log(150) = 2,176 , log(165) = 2,217 и log(180) = 2,255 . Логарифм 165 ближе к логарифму 180, поэтому резистор сопротивлением 180 Ом будет первым выбором, если нет других соображений.
Округляется ли значение x ∈ ( a , b ) до a или b , зависит от того, больше или меньше квадратное значение x 2 произведения ab . Значение 165 округляется до 180 в примере с резисторами, поскольку 165 2 = 27225 больше 150 × 180 = 27000 .
В арифметике с плавающей точкой округление направлено на то, чтобы превратить заданное значение x в значение y с указанным числом значащих цифр. Другими словами, y должно быть кратно числу m , которое зависит от величины x . Число m является степенью основания (обычно 2 или 10) представления с плавающей точкой.
За исключением этой детали, все рассмотренные выше варианты округления применимы и к округлению чисел с плавающей точкой. Алгоритм такого округления представлен в разделе Масштабированное округление выше, но с постоянным коэффициентом масштабирования s = 1 и целочисленным основанием b > 1 .
Если округленный результат переполняется, результатом направленного округления является либо соответствующая знаковая бесконечность при «округлении от нуля», либо наибольшее представимое положительное конечное число (или наименьшее представимое отрицательное конечное число, если x отрицательно) при «округлении к нулю». Результатом переполнения для обычного случая округления к ближайшему всегда является соответствующая бесконечность.
В некоторых контекстах желательно округлить заданное число x до «аккуратной» дроби – то есть ближайшей дроби y = m / n , числитель m и знаменатель n которой не превышают заданного максимума. Эта проблема довольно сильно отличается от округления значения до фиксированного числа десятичных или двоичных цифр или до кратного заданной единицы m . Эта проблема связана с последовательностями Фарея , деревом Штерна–Броко и непрерывными дробями .
Готовые пиломатериалы , писчая бумага, конденсаторы и многие другие изделия обычно продаются только в нескольких стандартных размерах.
Многие процедуры проектирования описывают, как вычислить приблизительное значение, а затем «округлить» его до некоторого стандартного размера, используя такие фразы, как «округлить вниз до ближайшего стандартного значения», «округлить вверх до ближайшего стандартного значения» или «округлить до ближайшего стандартного значения». [ 11 ] [ 12 ]
Когда набор предпочтительных значений равномерно распределен по логарифмической шкале, выбор наиболее близкого предпочтительного значения к любому заданному значению можно рассматривать как форму масштабированного округления . Такие округленные значения можно вычислить напрямую. [ 13 ]
Более общие правила округления могут разделять значения в произвольных точках разрыва, используемых, например, при биннинге данных . Связанный математически формализованный инструмент — последовательности указателей , которые используют понятия расстояния, отличные от простой разницы — например, последовательность может округляться до целого числа с наименьшей относительной (процентной) ошибкой.
При оцифровке непрерывных сигналов , таких как звуковые волны, общий эффект ряда измерений важнее точности каждого отдельного измерения. В этих обстоятельствах обычно используются дизеринг и связанная с ним техника, диффузия ошибок . Связанная с ним техника, называемая широтно-импульсной модуляцией, используется для получения аналогового типа выходного сигнала от инерциального устройства путем быстрой пульсации мощности с переменным рабочим циклом.
Диффузия ошибок пытается гарантировать, что ошибка, в среднем, минимизирована. При работе с пологим наклоном от единицы до нуля, выход будет равен нулю для первых нескольких членов, пока сумма ошибки и текущего значения не станет больше 0,5, в этом случае выводится 1, а разница вычитается из ошибки на данный момент. Дизеринг Флойда-Стейнберга является популярной процедурой диффузии ошибок при оцифровке изображений.
В качестве одномерного примера предположим, что числа 0,9677 , 0,9204 , 0,7451 и 0,3091 идут по порядку и каждое из них округляется до кратного 0,01 . В этом случае накопленные суммы 0,9677 , 1,8881 = 0,9677 + 0,9204 , 2,6332 = 0,9677 + 0,9204 + 0,7451 и 2,9423 = 0,9677 + 0,9204 + 0,7451 + 0,3091 округляются до кратного 0,01 : 0,97 , 1,89 , 2,63 и 2,94 . Первое из них и разности соседних значений дают искомые округленные значения: 0,97 , 0,92 = 1,89 − 0,97 , 0,74 = 2,63 − 1,89 и 0,31 = 2,94 − 2,63 .
Арифметика Монте-Карло — это метод в методах Монте-Карло , где округление происходит случайным образом вверх или вниз. Стохастическое округление может использоваться для арифметики Монте-Карло, но в целом чаще используется просто округление вверх или вниз с равной вероятностью. Повторные запуски дадут случайное распределение результатов, что может указывать на стабильность вычислений. [ 14 ]
Можно использовать округленную арифметику для оценки точного значения функции с целочисленной областью и диапазоном. Например, если известно, что целое число n является полным квадратом, его квадратный корень можно вычислить, преобразовав n в значение с плавающей точкой z , вычислив приблизительный квадратный корень x из z с плавающей точкой, а затем округлив x до ближайшего целого числа y . Если n не слишком велико, ошибка округления с плавающей точкой в x будет меньше 0,5, поэтому округленное значение y будет точным квадратным корнем из n . По сути, именно поэтому логарифмические линейки можно использовать для точной арифметики.
Округление числа дважды подряд до разных уровней точности, причем последняя точность будет грубее, не гарантирует получения того же результата, что и округление один раз до конечной точности, за исключением случая направленного округления. Например, округление 9,46 до одного десятичного знака дает 9,5, а затем 10 при округлении до целого числа с использованием округления наполовину до четного, но даст 9 при округлении до целого числа напрямую. Борман и Чатфилд обсуждают последствия двойного округления при сравнении данных, округленных до одного десятичного знака, с пределами спецификации, выраженными с использованием целых чисел.
В делах Martinez v. Allstate и Sendejo v. Farmers , которые шли в суде с 1995 по 1997 год, страховые компании утверждали, что двойное округление премий было допустимо и фактически требовалось. Суды США вынесли решение против страховых компаний и обязали их принять правила, обеспечивающие однократное округление.
Некоторые компьютерные языки и стандарт IEEE 754-2008 предписывают, что в простых вычислениях результат не должен округляться дважды. Это было особой проблемой для Java, поскольку он разработан для одинакового выполнения на разных машинах, пришлось использовать специальные программные трюки, чтобы добиться этого с плавающей точкой x87 . Язык Java был изменен, чтобы допускать разные результаты там, где разница не имеет значения, и требовать использования квалификатора strictfp , когда результаты должны точно соответствовать; строгая плавающая точка была восстановлена в Java 17.
В некоторых алгоритмах промежуточный результат вычисляется с большей точностью, а затем должен быть округлен до конечной точности. Двойного округления можно избежать, выбрав адекватное округление для промежуточных вычислений. Это заключается в том, чтобы избегать округления до средних точек для конечного округления (за исключением случаев, когда средняя точка точна). В двоичной арифметике идея состоит в том, чтобы округлить результат в сторону нуля и установить младший бит в 1, если округленный результат неточен; такое округление называется липким округлением . Эквивалентно, оно заключается в возврате промежуточного результата, когда он точно представим, и ближайшего числа с плавающей точкой с нечетной значащей точкой в противном случае; вот почему это также известно как округление до нечетного . Конкретная реализация этого подхода для двоичной и десятичной арифметики реализована как Округление для подготовки к меньшей точности .
Уильям М. Кахан ввел термин «Дилемма составителя таблиц» для обозначения неизвестной стоимости округления трансцендентных функций :
Никто не знает, сколько будет стоить вычисление y w правильно округленного для каждых двух аргументов с плавающей точкой, при которых не происходит переполнение/недополнение. Вместо этого авторитетные математические библиотеки вычисляют элементарные трансцендентные функции в основном в пределах чуть более половины ulp и почти всегда в пределах одного ulp. Почему y w нельзя округлить в пределах половины ulp, как SQRT? Потому что никто не знает, сколько вычислений это будет стоить... Не существует общего способа предсказать, сколько дополнительных цифр нужно будет перенести, чтобы вычислить трансцендентное выражение и правильно округлить его до некоторого заранее заданного числа цифр. Даже тот факт (если это правда), что конечного числа дополнительных цифр в конечном итоге будет достаточно, может быть глубокой теоремой. [ 23 ]
Стандарт IEEE 754 для чисел с плавающей точкой гарантирует, что сложение, вычитание, умножение, деление, объединенное умножение-сложение , квадратный корень и остаток с плавающей точкой дадут правильно округленный результат операции с бесконечной точностью. В стандарте 1985 года для более сложных функций такая гарантия не давалась, и они, как правило, точны только до последнего бита в лучшем случае. Однако стандарт 2008 года гарантирует, что соответствующие реализации дадут правильно округленные результаты, которые соответствуют активному режиму округления; реализация функций, однако, является необязательной.
Используя теорему Гельфонда–Шнайдера и теорему Линдемана–Вейерштрасса , можно доказать, что многие стандартные элементарные функции возвращают трансцендентные результаты, за исключением некоторых хорошо известных аргументов; поэтому, с теоретической точки зрения, всегда возможно правильно округлить такие функции. Однако для реализации такой функции определение предела для заданной точности того, насколько точные результаты должны быть вычислены, прежде чем можно будет гарантировать правильно округленный результат, может потребовать много времени на вычисления или может оказаться вне досягаемости. На практике, когда этот предел неизвестен (или известна только очень большая граница), необходимо принять некоторое решение в реализации (см. ниже); но согласно вероятностной модели, правильное округление может быть выполнено с очень высокой вероятностью при использовании промежуточной точности вплоть до удвоенного количества цифр целевого формата плюс некоторая малая константа (после учета особых случаев).
Некоторые пакеты программирования предлагают правильное округление. Пакет GNU MPFR дает правильно округленные результаты произвольной точности. Некоторые другие библиотеки реализуют элементарные функции с правильным округлением в формате IEEE 754 double precision (binary64):
Существуют вычислимые числа, для которых округленное значение никогда не может быть определено, независимо от того, сколько цифр вычислено. Конкретные примеры не могут быть приведены, но это следует из неразрешимости проблемы остановки . Например, если гипотеза Гольдбаха верна, но недоказуема , то результат округления следующего значения n до следующего целого числа не может быть определен: либо n = 1+10 − k , где k — первое четное число, большее 4, которое не является суммой двух простых чисел, либо n = 1, если такого числа нет. Округленный результат равен 2, если такое число k существует, и 1 в противном случае. Однако значение до округления можно аппроксимировать с любой заданной точностью, даже если гипотеза недоказуема.
Округление может негативно повлиять на поиск строки для числа. Например, π, округленное до четырех цифр, равно "3,1416", но простой поиск этой строки не обнаружит "3,14159" или любое другое значение π , округленное до более чем четырех цифр. Напротив, усечение не страдает от этой проблемы; например, простой поиск строки для "3,1415", что является π, усеченным до четырех цифр, обнаружит значения π, усеченные до более чем четырех цифр.
Концепция округления очень старая, возможно, старше, чем сама концепция деления. Некоторые древние глиняные таблички , найденные в Месопотамии, содержат таблицы с округленными значениями обратных величин и квадратных корней в основании 60. Округленные приближения к π , длине года и длине месяца также являются древними – см. примеры с основанием 60 .
Метод округления до половины служил в качестве американского стандарта Z25.1 и стандарта ASTM E-29 с 1940 года. Происхождение терминов «непредвзятое округление» и «округление статистиком» довольно очевидно. В четвертом издании « Вероятности и теории ошибок» 1906 года Роберт Симпсон Вудворд назвал это «правилом компьютера», указав, что тогда оно было широко распространено среди людей-компьютеров , которые вычисляли математические таблицы. Например, оно было рекомендовано в книге Саймона Ньюкомба «Логарифмические и другие математические таблицы» , изданной около 1882 года . В «Теории измерений» Люциуса Туттла 1916 года оно было названо «универсально принятым правилом» для записи физических измерений. Черчилль Эйзенхарт указал, что эта практика уже была «хорошо установлена» в анализе данных к 1940-м годам.
Происхождение термина «банковское округление» остается более неясным. Если этот метод округления когда-либо был стандартом в банковской сфере, доказательства этого найти крайне сложно. Напротив, раздел 2 доклада Европейской комиссии « Введение евро и округление валютных сумм» [предполагает, что ранее не существовало стандартного подхода к округлению в банковской сфере; и в нем указывается, что «половинчатые» суммы следует округлять в большую сторону.
До 1980-х годов метод округления, используемый в арифметике с плавающей точкой, обычно фиксировался аппаратно, был плохо документирован, непоследователен и отличался для каждой марки и модели компьютера. Эта ситуация изменилась после того, как большинство производителей компьютеров приняли стандарт IEEE 754 для операций с плавающей точкой. Стандарт позволяет пользователю выбирать между несколькими режимами округления и в каждом случае точно указывает, как следует округлять результаты. Эти особенности сделали числовые вычисления более предсказуемыми и машинно-независимыми, а также сделали возможной эффективную и последовательную реализацию интервальной арифметики .
В настоящее время многие исследования имеют тенденцию округлять до кратных 5 или 2. Например, Йорг Батен использовал накопление возраста во многих исследованиях, чтобы оценить уровень арифметической грамотности древних популяций. Он придумал индекс ABCC , который позволяет сравнивать арифметическую грамотность между регионами без каких-либо исторических источников, где измерялась грамотность населения .
Большинство языков программирования предоставляют функции или специальный синтаксис для округления дробных чисел различными способами. Самые ранние числовые языки, такие как FORTRAN и C , предоставляли только один метод, обычно усечение (в сторону нуля). Этот метод по умолчанию мог подразумеваться в определенных контекстах, например, при назначении дробного числа целочисленной переменной или использовании дробного числа в качестве индекса массива . Другие виды округления приходилось программировать явно; например, округление положительного числа до ближайшего целого можно было реализовать путем прибавления 0,5 и усечения.
Однако в последние десятилетия синтаксис и стандартные библиотеки большинства языков обычно предоставляют по крайней мере четыре основные функции округления (вверх, вниз, к ближайшему и к нулю). Метод разрешения конфликтов может различаться в зависимости от языка и версии или может быть выбран программистом. Несколько языков следуют примеру стандарта IEEE 754 для чисел с плавающей точкой и определяют эти функции как принимающие аргумент с плавающей точкой двойной точности и возвращающие результат того же типа, который затем может быть преобразован в целое число при необходимости. Такой подход позволяет избежать ложных переполнений , поскольку типы с плавающей точкой имеют больший диапазон, чем целочисленные типы. Некоторые языки, такие как PHP , предоставляют функции, которые округляют значение до указанного количества десятичных цифр (например, от 4321,5678 до 4321,57 или 4300). Кроме того, многие языки предоставляют функцию форматирования строк printf или аналогичную ей, которая позволяет преобразовать дробное число в строку, округленную до указанного пользователем количества десятичных знаков ( точность ). С другой стороны, усечение (округление до нуля) по-прежнему является методом округления по умолчанию, используемым во многих языках, особенно для деления двух целочисленных значений.
Напротив, CSS и SVG не определяют никакой конкретной максимальной точности для чисел и измерений, которые они обрабатывают и представляют в своем DOM и в своем интерфейсе IDL как строки, как если бы они имели бесконечную точность , и не делают различий между целыми числами и значениями с плавающей точкой; однако реализации этих языков обычно преобразуют эти числа в значения с плавающей точкой двойной точности IEEE 754 перед тем, как предоставить вычисленные цифры с ограниченной точностью (особенно в стандартных привязках интерфейсов JavaScript или ECMAScript ).
Проблема округления в программировании — это распространенная и часто встречающаяся ситуация, связанная с тем, как компьютер обрабатывает числа с плавающей запятой. Поскольку компьютеры используют бинарную систему для представления чисел, многие десятичные дроби не могут быть точно представлены, что приводит к ошибкам округления. Вот основные аспекты этой проблемы:
продолжение следует...
Часть 1 Округление чисел (вниз. вверх, случайное, до числа, логарифмическое, отраслевое)
Часть 2 Округление до других значений - Округление чисел (вниз. вверх, случайное,
Часть 3 Другие стандарты округления - Округление чисел (вниз. вверх, случайное, до
Если я не полностью рассказал про округление чисел? Напиши в комментариях Надеюсь, что теперь ты понял что такое округление чисел и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Арифметика
Комментарии
Оставить комментарий
Арифметика
Термины: Арифметика