stringtranslate.com

Округление

Графики результата y округления x с использованием различных методов. Для наглядности графики показаны смещенными от целочисленных значений y . В файле SVG наведите указатель мыши на метод, чтобы выделить его, а в браузерах с поддержкой SMIL щелкните его, чтобы выбрать или отменить выбор.

Округление означает замену числа приблизительным значением , которое имеет более короткое, простое или более явное представление. Например, заменив 23,4476 доллара на 23,45 доллара, дробь 312/937 на 1/3 или выражение √2 на 1,414.

Округление часто выполняется для получения значения, которое легче сообщить и сообщить, чем исходное. Округление также может быть важным, чтобы избежать вводящего в заблуждение точного сообщения о вычисленном числе, измерении или оценке; например, количество, которое было рассчитано как 123 456, но известно, что оно имеет точность лишь с точностью до нескольких сотен единиц, обычно лучше указывать как «около 123 500».

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

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

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

Волнистый знак равенства ( приблизительно равно ) иногда используется для обозначения округления точных чисел, например 9,98 ≈ 10. Этот знак был введен Альфредом Джорджем Гринхиллом в 1892 году. [1]

Идеальные характеристики методов округления включают в себя:

  1. Округление должно выполняться функцией . Таким образом, когда одни и те же входные данные округляются в разных случаях, выходные данные остаются неизменными.
  2. Расчеты, выполненные с округлением, должны быть близки к расчетам, выполненным без округления.
    • В результате (1) и (2) результат округления должен быть близок к входу, часто как можно ближе по некоторому показателю .
  3. Чтобы считаться округлением, диапазон будет подмножеством домена , как правило, дискретным . Классический диапазон — целые числа Z .
  4. Округление должно сохранять симметрию , которая уже существует между доменом и диапазоном. При конечной точности (или дискретной области) это означает устранение смещения .
  5. Метод округления должен быть полезен в информатике или человеческой арифметике, где используется конечная точность и скорость имеет большое значение.

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

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

Виды округления

Типичные проблемы округления включают в себя:

Округление до целого числа

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

Направленное округление до целого числа

Эти четыре метода называются направленным округлением до целого числа , поскольку все смещения от исходного числа x до округленного значения y направлены к одному и тому же предельному значению (0, +∞ или −∞) или от него. Направленное округление используется в интервальной арифметике и часто требуется в финансовых расчетах.

Если x положительное значение, округление вниз аналогично округлению к нулю, а округление вверх аналогично округлению от нуля. Если x отрицательное значение, округление вниз аналогично округлению от нуля, а округление вверх аналогично округлению к нулю. В любом случае, если x — целое число, y — это просто x .

Если множество вычислений выполняется последовательно, выбор метода округления может оказать очень существенное влияние на результат. Известный случай связан с новым индексом , установленным Ванкуверской фондовой биржей в 1982 году. Первоначально он был установлен на уровне 1 000 000 (точность с тремя знаками после запятой), а через 22 месяца упал примерно до 520, тогда как цены на акции в целом выросли за этот период. . Проблема была вызвана тем, что индекс пересчитывался тысячи раз в день и всегда округлялся до трех знаков после запятой, так что накапливались ошибки округления. Пересчет с более точным округлением дал значение индекса 1098,892 на конец того же периода. [3]

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

Округление вниз

Можно округлить в меньшую сторону (или взять пол , или округлить в сторону отрицательной бесконечности ): y — наибольшее целое число, не превосходящее x .

Например, 23,7 округляется до 23, а -23,2 округляется до -24.

Округления

Можно также округлить в большую сторону (или взять максимальную величину , или округлить в сторону положительной бесконечности ): y — наименьшее целое число, не меньшее x .

Например, 23,2 округляется до 24, а -23,7 округляется до -23.

Округление к нулю

Можно также округлить к нулю (или усечь , или округлить от бесконечности ): y — целое число, ближайшее к x , такое, что оно находится между 0 и x (включительно); т.е. y — целая часть x без цифр дробной части.

Например, 23,7 округляется до 23, а -23,7 округляется до -23.

Округление от нуля

Можно также округлить от нуля (или округлить до бесконечности ): y — целое число, ближайшее к 0 (или, что эквивалентно, к x ), такое, что x находится между 0 и y (включительно).

Например, 23,2 округляется до 24, а -23,2 округляется до -24.

Округление до ближайшего целого числа

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

Если бы не дробные части по 0,5, ошибки округления, вносимые методом округления до ближайшего, были бы симметричными: для каждой дроби, округляемой в меньшую сторону (например, 0,268), существует дополнительная дробь (а именно 0,732), которая округляется на такую ​​же сумму.

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

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

Округление половины вверх

Можно округлить половину в большую сторону (или округлить половину в сторону положительной бесконечности ). Это правило разрешения споров широко используется во многих дисциплинах. [ нужна цитация ] То есть средние значения x всегда округляются вверх.

Например, 23,5 округляется до 24, а -23,5 округляется до -23.

Однако некоторые языки программирования (такие как Java, Python) определяют здесь свою половину как круглую половину от нуля . [4] [5]

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

Округление половины вниз

Можно также округлить половину вниз (или округлить половину в сторону отрицательной бесконечности ) в отличие от более распространенного округления половины вверх .

Например, 23,5 округляется до 23, а -23,5 округляется до -24.

Однако некоторые языки программирования (например, Java, Python) определяют здесь половину числа вниз как круглую половину к нулю . [4] [5]

Округление половины в сторону нуля

Можно также округлить половину к нулю (или округлить половину от бесконечности ) в отличие от обычного округления половины от нуля .

Например, 23,5 округляется до 23, а -23,5 округляется до -23.

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

Округление половины от нуля

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

Например, 23,5 округляется до 24, а -23,5 округляется до -24.

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

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

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

Округление половины до четного

Можно также округлить половину до четного, правило разрешения ничьей без положительного/отрицательного смещения и без смещения в сторону/от нуля. Согласно этому соглашению, если дробная часть x равна 0,5, то y — четное целое число, ближайшее к x . Так, например, 23,5 становится 24, как и 24,5; однако -23,5 становится -24, как и -24,5. Эта функция минимизирует ожидаемую ошибку при суммировании округленных чисел, даже если входные данные в основном положительные или преимущественно отрицательные, при условии, что они не являются ни преимущественно четными, ни преимущественно нечетными.

Этот вариант метода округления до ближайшего также называется сходящимся округлением , статистическим округлением , голландским округлением , гауссовским округлением , нечетно-четным округлением [ 6] или банкирским округлением .

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

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

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

Округление половины до нечетной

Можно также округлить половину до нечетного — аналогичное правило округления половины до четного. В этом подходе, если дробная часть x равна 0,5, то y — нечетное целое число, ближайшее к x . Так, например, 23,5 становится 23, как и 22,5; в то время как -23,5 становится -23, как и -22,5.

Этот метод также свободен от положительного/отрицательного смещения и смещения в сторону/от нуля, при условии, что числа, подлежащие округлению, не являются ни преимущественно четными, ни преимущественно нечетными. Он также разделяет свойство округления от половины до чета, искажая исходное распределение, поскольку увеличивает вероятность шансов по сравнению с четами. Этот метод использовался для банковских балансов в Соединенном Королевстве , когда оно переводило свою валюту в десятичную систему [7] [ необходимы разъяснения ] .

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

Округление для подготовки к меньшей точности

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

При десятичной арифметике последние цифры 0 и 5 избегаются; если имеется выбор между числами, младшая цифра которых равна 0 или 1, 4 или 5, 5 или 6, 9 или 0, то выбирается цифра, отличная от 0 или 5; в противном случае выбор произволен. IBM определяет, что в последнем случае должна выбираться цифра с меньшим значением. [8] RPSP может применяться с шагом между двумя последовательными округлениями, составляющим одну цифру (например, округление до 1/10 может применяться после округления до 1/100). Например, при округлении до целого числа:

В примере из раздела «Двойное округление» округление 9,46 до десятичной дроби дает 9,4, а округление до целого числа, в свою очередь, дает 9.

В двоичной арифметике это округление также называется «округлением до нечетного» (не путать с «округлением до половины до нечетного»). Например, при округлении до 1/4 (0,01 в двоичном формате)

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

Если ошибочный средний шаг удален, последнее округление до целого числа округляет 3,25 до правильного значения 3.

RPSP реализован аппаратно в IBM zSeries и pSeries .

Рандомизированное округление до целого числа

Попеременный тай-брейк

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

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

Случайный тай-брейк

Подобно округлению половины до четного и округления половины до нечетного, это правило, по существу, свободно от общей предвзятости, но оно также справедливо для четных и нечетных значений y . Преимущество перед поочередным разделением на тай-брейки состоит в том, что последнее направление округления дробной части 0,5 не нужно «запоминать».

Стохастическое округление

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

Например, 1,6 будет округлено до 1 с вероятностью 0,4 и до 2 с вероятностью 0,6.

Стохастическое округление может быть таким точным, каким никогда не может быть функция округления. Например, предположим, что кто-то начал с 0 и добавил к этому значению 0,3 сто раз, округляя промежуточную сумму между каждым добавлением. Результатом будет 0 при обычном округлении, но при стохастическом округлении ожидаемый результат будет 30, что соответствует тому же значению, полученному без округления. Это может быть полезно в машинном обучении , где при обучении можно итеративно использовать арифметику низкой точности. [9] Стохастическое округление также является способом достижения одномерного сглаживания .

Сравнение подходов округления до целого числа

Округление до других значений

Округление до заданного кратного

Самый распространенный тип округления — округление до целого числа; или, в более общем смысле, до целого числа, кратного некоторому приращению — например, округления до целых десятых долей секунды, сотых долей доллара, до целых кратных 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 ( серия Е12 ). Если расчет показывает, что требуется резистор сопротивлением 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 и знаменатель которой которой не превышают заданного максимума. Эта проблема существенно отличается от проблемы округления значения до фиксированного числа десятичных или двоичных цифр или до числа, кратного заданной единице m . Эта проблема связана с последовательностями Фарея , деревом Штерна–Броко и цепными дробями .

Округление до доступного значения

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

Многие процедуры проектирования описывают, как вычислить приблизительное значение, а затем «округлить» до некоторого стандартного размера, используя такие фразы, как «округлить до ближайшего стандартного значения», «округлить до ближайшего стандартного значения» или «округлить до ближайшего стандартного значения». . [10] [11]

Когда набор предпочтительных значений равномерно распределен по логарифмической шкале, выбор наиболее близкого предпочтительного значения к любому заданному значению можно рассматривать как форму масштабированного округления. Такие округленные значения можно вычислить напрямую. [12]

Округление в других контекстах

Дизеринг и диффузия ошибок

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

Распространение ошибок пытается обеспечить минимизацию ошибки в среднем. При плавном наклоне от единицы до нуля выходной сигнал будет нулевым для первых нескольких членов, пока сумма ошибки и текущее значение не станут больше 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 .

Арифметика Монте-Карло

Арифметика Монте-Карло — это метод метода Монте-Карло , при котором округление производится случайным образом в большую или меньшую сторону. Стохастическое округление можно использовать для арифметики Монте-Карло, но в целом чаще используется просто округление в большую или меньшую сторону с равной вероятностью. Повторные прогоны дадут случайное распределение результатов, что может указывать на стабильность вычислений. [13]

Точные вычисления с округленной арифметикой

Можно использовать округленную арифметику для вычисления точного значения функции с целочисленным доменом и диапазоном. Например, если известно, что целое число n является точным квадратом, его квадратный корень можно вычислить путем преобразования n в значение z с плавающей запятой , вычисления приблизительного квадратного корня x из z с плавающей запятой, а затем округления x до ближайшее целое число y . Если n не слишком велико, ошибка округления с плавающей запятой в x будет меньше 0,5, поэтому округленное значение y будет точным квадратным корнем из n . По сути, именно поэтому логарифмические линейки можно использовать для точной арифметики.

Двойное округление

Двойное округление числа подряд до разных уровней точности, причем последняя точность является более грубой, не гарантирует того же результата, что и однократное округление до конечной точности, за исключением случая направленного округления. [nb 1] Например, округление 9,46 до одной десятичной дроби дает 9,5, а затем 10 при округлении до целого числа с использованием округления до половины до четного, но дает 9 при непосредственном округлении до целого числа. Борман и Чатфилд [14] обсуждают последствия двойного округления при сравнении данных, округленных до одного десятичного знака, с пределами спецификации, выраженными с использованием целых чисел.

В делах Мартинес против Олстейт и Сендехо против Фармерс , которые рассматривались в период с 1995 по 1997 год, страховые компании утверждали, что двойное округление страховых взносов допустимо и фактически необходимо. Суды США вынесли решение против страховых компаний и обязали их принять правила, обеспечивающие единое округление. [15]

Некоторые компьютерные языки и стандарт IEEE 754-2008 требуют, чтобы при простых вычислениях результат не округлялся дважды. Это была особая проблема с Java, поскольку она спроектирована для одинакового запуска на разных машинах, и для достижения этого с плавающей запятой x87 приходилось использовать специальные приемы программирования . [16] [17] Язык Java был изменен, чтобы обеспечить возможность получения различных результатов там, где разница не имеет значения, и требовать использования квалификатора strictfp , когда результаты должны точно соответствовать; строгая плавающая запятая была восстановлена ​​в Java 17. [18]

В некоторых алгоритмах промежуточный результат вычисляется с большей точностью, а затем его необходимо округлить до конечной точности. Двойного округления можно избежать, выбрав подходящее округление для промежуточных вычислений. Это заключается в том, чтобы избежать округления до средних точек для окончательного округления (за исключением случаев, когда средняя точка является точной). В двоичной арифметике идея состоит в том, чтобы округлить результат в сторону нуля и установить младший бит равным 1, если округленный результат неточен; такое округление называется липким округлением . [19] Эквивалентно, он заключается в возврате промежуточного результата, когда он точно представим, и ближайшего числа с плавающей запятой с нечетным мантиссом в противном случае; вот почему это также известно как округление до нечетного . [20] [21] Конкретная реализация этого подхода для двоичной и десятичной арифметики реализована как округление для подготовки к более короткой точности.

Дилемма столовщика

Уильям М. Кахан придумал термин «Дилемма столовщика» для обозначения неизвестной стоимости округления трансцендентных функций :

Никто не знает, сколько будет стоить вычисление y w , правильно округленного для каждых двух аргументов с плавающей запятой, при которых не происходит переполнения/недополнения. Вместо этого авторитетные математические библиотеки вычисляют элементарные трансцендентные функции в основном в пределах чуть более половины ulp и почти всегда в пределах одного ulp. Почему нельзя округлить значение до половины значения, как SQRT? Потому что никто не знает, сколько это будет стоить вычислений... Не существует общего способа предсказать, сколько дополнительных цифр придется перенести, чтобы вычислить трансцендентное выражение и правильно округлить его до некоторого заранее заданного количества цифр. Даже тот факт (если это правда), что конечного числа дополнительных цифр в конечном итоге будет достаточно, может оказаться глубокой теоремой. [22]

Стандарт IEEE 754 для операций с плавающей запятой гарантирует, что сложение, вычитание, умножение, деление, объединенное умножение-сложение , квадратный корень и остаток с плавающей запятой дадут правильно округленный результат операции с бесконечной точностью. В стандарте 1985 года такой гарантии не было дано для более сложных функций, и обычно они имеют точность в лучшем случае только до последнего бита. Однако стандарт 2008 года гарантирует, что соответствующие реализации будут давать правильно округленные результаты, соответствующие активному режиму округления; однако реализация функций не является обязательной.

Используя теорему Гельфонда-Шнайдера и теорему Линдеманна-Вейерштрасса , можно доказать, что многие стандартные элементарные функции возвращают трансцендентные результаты, за исключением некоторых хорошо известных аргументов; поэтому с теоретической точки зрения всегда можно правильно округлить такие функции. Однако для реализации такой функции определение предела заданной точности того, насколько точные результаты должны быть вычислены, прежде чем можно будет гарантировать правильно округленный результат, может потребовать много времени вычислений или может быть недосягаемым. [23] На практике, когда этот предел неизвестен (или известен только очень большой предел), при реализации необходимо принять какое-то решение (см. ниже); но согласно вероятностной модели правильное округление может быть выполнено с очень высокой вероятностью при использовании промежуточной точности, до удвоенного количества цифр целевого формата плюс некоторая небольшая константа (после учета особых случаев).

Некоторые пакеты программирования предлагают правильное округление. Пакет GNU MPFR дает правильно округленные результаты произвольной точности. Некоторые другие библиотеки реализуют элементарные функции с правильным округлением в двойной точности IEEE 754 (binary64):

Существуют вычислимые числа , для которых невозможно определить округленное значение, сколько бы цифр ни вычислялось. Конкретные примеры привести невозможно, но это следует из неразрешимости проблемы остановки . Например, если гипотеза Гольдбаха верна, но недоказуема , то результат округления следующего значения n до следующего целого числа не может быть определен: либо n =1+10 k , где k — первое четное число, большее 4, которое не является суммой двух простых чисел или n = 1, если такого числа не существует. Округленный результат равен 2, если такое число k существует, и 1 в противном случае. Однако значение до округления может быть аппроксимировано с любой заданной точностью, даже если гипотеза недоказуема.

Взаимодействие со строковым поиском

Округление может отрицательно повлиять на строковый поиск числа. Например, π, округленное до четырех цифр, — это «3,1416», но простой поиск по этой строке не обнаружит «3,14159» или любое другое значение π , округленное до более чем четырех цифр. Напротив, усечение не страдает от этой проблемы; например, простой строковый поиск по запросу «3,1415», который представляет собой π, усеченный до четырех цифр, обнаружит значения π , усеченные до более чем четырех цифр.

История

Концепция округления очень старая, возможно, старше, чем сама концепция деления. Некоторые древние глиняные таблички , найденные в Месопотамии , содержат таблицы с округленными значениями обратных величин и квадратными корнями по основанию 60. [37] Округленные приближения к π , длине года и длине месяца также являются древними — см. примеры по основанию 60 .

Метод округления до четного служит стандартом ASTM (E-29) с 1940 года. Происхождение терминов « несмещенное округление» и «статистическое округление» достаточно понятно. В четвертом издании « Вероятности и теории ошибок» 1906 года [38] Роберт Симпсон Вудворд назвал это «правилом компьютера», указывая, что в то время оно широко использовалось людьми-компьютерами , вычислявшими математические таблицы. Черчилль Эйзенхарт отметил, что эта практика уже «хорошо укоренилась» в анализе данных к 1940-м годам. [39]

Происхождение банковского округления терминов остается более неясным. Если этот метод округления когда-либо был стандартом в банковской сфере, найти доказательства оказалось чрезвычайно трудно. Напротив, раздел 2 доклада Европейской комиссии « Введение евро и округление денежных сумм» [40] предполагает, что ранее не существовало стандартного подхода к округлению в банковской сфере; и в нем указано, что «половинные» суммы следует округлять в большую сторону.

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

В настоящее время во многих исследованиях принято округлять числа, кратные 5 или 2. Например, Йорг Батен во многих исследованиях использовал возрастную кучу , чтобы оценить уровень умения считать у древних популяций. Он разработал индекс ABCC , который позволяет сравнивать навыки счета между регионами без каких-либо исторических источников, в которых измерялась грамотность населения . [41]

Функции округления в языках программирования

Большинство языков программирования предоставляют функции или специальный синтаксис для округления дробных чисел различными способами. Самые ранние числовые языки, такие как FORTRAN и C , предоставляли только один метод, обычно усечение (в сторону нуля). Этот метод по умолчанию может подразумеваться в определенных контекстах, например, при присвоении дробного числа целочисленной переменной или использовании дробного числа в качестве индекса массива . Другие виды округления нужно было запрограммировать явно; например, округление положительного числа до ближайшего целого числа можно реализовать путем добавления 0,5 и усечения.

Однако в последние десятилетия синтаксис и стандартные библиотеки большинства языков обычно предоставляют как минимум четыре основные функции округления (вверх, вниз, до ближайшего и к нулю). Метод разрешения конфликтов может варьироваться в зависимости от языка и версии или может быть выбран программистом. Некоторые языки следуют примеру стандарта IEEE 754 с плавающей запятой и определяют эти функции как принимающие аргумент с плавающей запятой двойной точности и возвращающие результат того же типа, который затем при необходимости может быть преобразован в целое число. Этот подход позволяет избежать ложных переполнений , поскольку типы с плавающей запятой имеют больший диапазон, чем целочисленные типы. Некоторые языки, такие как PHP , предоставляют функции, которые округляют значение до указанного количества десятичных цифр (например, от 4321,5678 до 4321,57 или 4300). Кроме того, многие языки предоставляют функцию printf или аналогичную функцию форматирования строк, которая позволяет преобразовать дробное число в строку, округленную до заданного пользователем количества десятичных знаков (точность ) . С другой стороны, усечение (округление до нуля) по-прежнему является методом округления по умолчанию, используемым во многих языках, особенно для деления двух целочисленных значений.

Напротив, CSS и SVG не определяют какой-либо конкретной максимальной точности для чисел и измерений, которые они обрабатывают и отображают в своей DOM и в своем IDL- интерфейсе как строки, как если бы они имели бесконечную точность , и не делают различия между целыми числами и числами с плавающей запятой. ценности; однако реализации этих языков обычно преобразуют эти числа в значения с плавающей запятой двойной точности IEEE 754 перед предоставлением вычисленных цифр с ограниченной точностью (особенно в рамках стандартных привязок интерфейса JavaScript или ECMAScript [42] ).

Другие стандарты округления

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

наблюдения за погодой в США

В руководящих указаниях, выпущенных в середине 1966 года, [43] Управление федерального координатора по метеорологии США определило, что данные о погоде следует округлять до ближайшего круглого числа, используя правило округления половины вверх. Например, 1,5, округленное до целого числа, должно стать 2, а -1,5 должно стать -1. До этой даты правило тай-брейка было «на половине раунда от нуля».

Отрицательный ноль в метеорологии

Некоторые метеорологи могут писать «-0», чтобы указать температуру от 0,0 до -0,5 градусов (исключительно), округленную до целого числа. Это обозначение используется, когда отрицательный знак считается важным, независимо от того, насколько мала его величина; например, при округлении температуры по шкале Цельсия , где ниже нуля указывает на замерзание. [ нужна цитата ]

Смотрите также

Примечания

  1. ^ Случай, когда двойное округление всегда приводит к тому же значению, что и непосредственное округление до конечной точности, - это когда система счисления нечетна.

Рекомендации

  1. ^ Исайя Ланкхэм, Бруно Нахтергаэле , Энн Шиллинг : Линейная алгебра как введение в абстрактную математику. World Scientific, Сингапур, 2016 г., ISBN  978-981-4730-35-8 , стр. 186.
  2. ^ Кулиш, Ульрих В. (июль 1977 г.). «Математические основы компьютерной арифметики». Транзакции IEEE на компьютерах . С-26 (7): 610–621. дои : 10.1109/TC.1977.1674893. S2CID  35883481.
  3. ^ Хайэм, Николас Джон (2002). Точность и устойчивость численных алгоритмов . п. 54. ИСБН 978-0-89871-521-7.
  4. ^ ab "java.math.RoundingMode". Оракул.
  5. ^ ab «decimal — Десятичная арифметика с фиксированной запятой и с плавающей запятой». Фонд программного обеспечения Python.
  6. ^ Руководство по стандартам технического проектирования (НАСА), X-673-64-1F, стр. 90.
  7. ^ Приложение 1 Закона о десятичной валюте 1969 г.
  8. ^ Принципы работы IBM z/Architecture
  9. ^ аб Гупта, Суйог; Анграул, Анкур; Гопалакришнан, Кайлас; Нарайанан, Притиш (9 февраля 2016 г.). «Глубокое обучение с ограниченной числовой точностью». п. 3. arXiv : 1502.02551 [cs.LG].
  10. ^ «Регуляторы напряжения на стабилитронах» (PDF) . Архивировано (PDF) из оригинала 13 июля 2011 г. Проверено 24 ноября 2010 г.
  11. ^ "Создайте зеркальный тестер"
  12. ^ Брюс Трамп, Кристин Шнайдер. «Формула Excel рассчитывает стандартные значения резисторов 1%». Электронный дизайн , 21 января 2002 г. [1]
  13. ^ Паркер, Д. Стотт; Эггерт, Пол Р.; Пирс, Брэд (28 марта 2000 г.). «Арифметика Монте-Карло: основа статистического анализа ошибок округления». Вычисления IEEE в науке и технике.
  14. ^ Борман, Фил; Чатфилд, Мэрион (10 ноября 2015 г.). «Избегайте опасностей использования округленных данных». Журнал фармацевтического и биомедицинского анализа . 115 : 506–507. дои : 10.1016/j.jpba.2015.07.021. ПМИД  26299526.
  15. ^ Дебора Р. Хенслер (2000). Дилеммы групповых действий: достижение общественных целей ради частной выгоды . РЭНД. стр. 255–293. ISBN 0-8330-2601-1.
  16. ^ Сэмюэл А. Фигероа (июль 1995 г.). «Когда двойное округление безобидно?». Информационный бюллетень ACM SIGNUM . АКМ. 30 (3): 21–25. дои : 10.1145/221332.221334 . S2CID  14829295.
  17. ^ Роджер Голливер (октябрь 1998 г.). «Эффективное получение ортогональных двойных результатов IEEE по умолчанию с использованием расширенного оборудования IEEE» (PDF) . Интел.
  18. ^ Дарси, Джозеф Д. «JEP 306: Восстановление всегда строгой семантики с плавающей запятой» . Проверено 12 сентября 2021 г.
  19. ^ Мур, Дж. Стротер; Линч, Том; Кауфманн, Мэтт (1996). «Механически проверенное доказательство корректности ядра алгоритма деления с плавающей запятой AMD5K86» (PDF) . Транзакции IEEE на компьютерах . 47 . CiteSeerX 10.1.1.43.3309 . дои : 10.1109/12.713311 . Проверено 2 августа 2016 г. 
  20. ^ Болдо, Сильви ; Мелькионд, Гийом (2008). «Эмуляция FMA и правильно округленные суммы: проверенные алгоритмы, использующие округление до нечетности» (PDF) . Транзакции IEEE на компьютерах . 57 (4): 462–471. дои : 10.1109/TC.2007.70819. S2CID  1850330 . Проверено 2 августа 2016 г.
  21. ^ «21718 — округление в реальном времени не идеально» . gcc.gnu.org .
  22. ^ Кахан, Уильям Мортон . «Логарифм, слишком умный наполовину» . Проверено 14 ноября 2008 г.
  23. ^ Мюллер, Жан-Мишель; Бризебар, Николя; де Динешен, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Стеле, Дэмиен; Торрес, Серж (2010). «Глава 12: Решение дилеммы столовщика». Справочник по арифметике с плавающей запятой (1-е изд.). Биркхойзер . дои : 10.1007/978-0-8176-4705-6. ISBN 978-0-8176-4704-9. LCCN  2009939668.
  24. ^ "Дайджест NA, воскресенье, 18 апреля 1999 г., том 99: выпуск 16" . 18 апреля 1999 г. Проверено 29 августа 2022 г.
  25. ^ «Математическая библиотека для Java». Архивировано из оригинала 8 мая 1999 г.
  26. ^ «Точная портативная математическая библиотека». Архивировано из оригинала 7 февраля 2005 г.
  27. ^ mathlib на GitHub .
  28. ^ «libultim - идеальная библиотека элементарных функций с правильным округлением» . Архивировано из оригинала 01 марта 2021 г.
  29. ^ "Git - glibc.git/commit". Sourceware.org . Проверено 18 июля 2022 г.
  30. ^ де Динешен, Флоран; Лаутер, Кристоф; Мюллер, Жан-Мишель (январь – март 2007 г.). «Быстрое и правильное округление логарифмов двойной точности». РАЙРО-Теор. Инф. Приложение . 41 (1): 85–102. CiteSeerX 10.1.1.106.6652 . дои : 10.1051/ita: 2007003. HAL  энсл-00000007v2. 
  31. ^ «CRlibm - Математическая библиотека с правильными округлениями» . Архивировано из оригинала 27 октября 2016 г.
  32. ^ crlibm на GitHub
  33. ^ «libmcr - правильно округленная библиотека элементарных функций» . Архивировано из оригинала 25 февраля 2021 г.
  34. ^ libmcr на GitHub .
  35. ^ "Проект CORE-MATH" . Проверено 30 августа 2022 г.
  36. ^ Сибиданов, Алексей; Циммерманн, Пол; Глонду, Стефан (2022). Проект CORE-MATH. 29-й симпозиум IEEE по компьютерной арифметике (ARITH 2022) . Проверено 30 августа 2022 г.
  37. ^ Дункан Дж. Мелвилл. «Глиняная табличка YBC 7289». 2006 г.
  38. ^ Вероятность и теория ошибок. Математические монографии, вып. 7. Дж. Уайли и сын. 1906. {{cite book}}: |website=игнорируется ( помощь )
  39. ^ Черчилль Эйзенхарт (1947). «Эффекты округления или группировки данных». В Эйзенхарте; Хастей; Уоллис (ред.). Избранные методы статистического анализа для научных и промышленных исследований, а также производственной и управленческой техники . Нью-Йорк: МакГроу-Хилл. стр. 187–223 . Проверено 30 января 2014 г.
  40. ^ «Введение евро и округление денежных сумм» (PDF) . Архивировано (PDF) из оригинала 9 октября 2010 г. Проверено 19 августа 2011 г.
  41. ^ Батен, Йорг (2009). «Количественная оценка количественной грамотности: возрастное накопление и история человеческого капитала» (PDF) . Журнал экономической истории . 69 (3): 783–808. дои : 10.1017/S0022050709001120. hdl : 10230/481 . S2CID  35494384.
  42. ^ «Спецификация языка ECMA-262 ECMAScript» (PDF) . ecma-international.org .
  43. ^ OFCM, 2005: Федеральный метеорологический справочник № 1. Архивировано 20 апреля 1999 г. в Wayback Machine , Вашингтон, округ Колумбия, 104 стр.

Внешние ссылки