stringtranslate.com

Округление

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В приведенных ниже примерах sgn( 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 всегда округляются вверх. Если дробная часть x равна точно 0,5, то y = x + 0,5

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

В некоторых языках программирования (например, Java и Python) термин «half up» используется для обозначения округления половины от нуля , а не округления половины в сторону положительной бесконечности . [4] [5]

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

Округление в меньшую сторону

Можно также округлить половину вниз (или округлить половину в сторону отрицательной бесконечности ) в отличие от более распространенного округления половины вверх . Если дробная часть x равна точно 0,5, то y = x − 0,5

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

В некоторых языках программирования (например, Java и Python) термин «half down» используется для обозначения округления половины в сторону нуля , а не округления половины в сторону отрицательной бесконечности . [4] [5]

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

Можно также округлить половину в сторону нуля (или округлить половину от бесконечности ) в отличие от обычного округления половины от нуля . Если дробная часть x равна точно 0,5, то y = x − 0,5, если x положительно, и y = x + 0,5, если x отрицательно.

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

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

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

Можно также округлить половину от нуля (или округлить половину к бесконечности ), это правило разрешения ничьих, которое обычно изучают и используют, а именно: если дробная часть x равна точно 0,5, то y = x + 0,5 , если x положительно, и y = x − 0,5, если x отрицательно.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В десятичной арифметике избегаются конечные цифры 0 и 5; если есть выбор между числами с наименее значащей цифрой 0 или 1, 4 или 5, 5 или 6, 9 или 0, то должна быть выбрана цифра, отличная от 0 или 5; в противном случае выбор произволен. IBM определяет, что в последнем случае должна быть выбрана цифра с меньшей величиной. [9] 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, чередуйте округление вверх или вниз: для первого появления дробной части 0,5 округляйте вверх, для второго появления округляйте вниз и т. д. В качестве альтернативы округление первой дробной части 0,5 может быть определено случайным начальным числом . «Вверх» и «вниз» могут быть любыми двумя методами округления, которые противоположны друг другу — к положительной бесконечности и от нее или к нулю и от нее.

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

Случайный выбор победителя

Если дробная часть x равна 0,5, выбираем y случайным образом между x + 0,5 и x − 0,5 с равной вероятностью. Все остальные округляются до ближайшего целого числа.

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

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

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

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

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

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

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

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

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

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

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

В делах Martinez v. Allstate и Sendejo v. Farmers , которые шли в суд с 1995 по 1997 год, страховые компании утверждали, что двойное округление премий было допустимо и фактически требовалось. Суды США вынесли решение против страховых компаний и обязали их принять правила, обеспечивающие однократное округление. [16]

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

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

Дилемма изготовителя столов

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

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

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

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

Некоторые пакеты программирования предлагают правильное округление. Пакет 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. [40] Округленные приближения к π , длине года и длине месяца также являются древними – см. примеры с основанием 60 .

Метод округления от половины до четного служил в качестве американского стандарта Z25.1 и стандарта ASTM E-29 с 1940 года. [41] Происхождение терминов «непредвзятое округление» и «округление статистиком» довольно очевидно. В четвертом издании « Вероятности и теории ошибок» 1906 года Роберт Симпсон Вудворд назвал это «правилом компьютера», [42] указав, что тогда оно было широко распространено среди людей-компьютеров, которые вычисляли математические таблицы. Например, оно было рекомендовано в книге Саймона Ньюкомба «Логарифмические и другие математические таблицы» , изданной около 1882 года . [43] В «Теории измерений» Люциуса Туттла 1916 года оно было названо «универсально принятым правилом» для записи физических измерений. [44] Черчилль Эйзенхарт указал, что эта практика уже была «хорошо установлена» в анализе данных к 1940-м годам. [45]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примечания

  1. ^ Это необходимо, например, [1] для распределения мест , реализованного, например, методом наибольшего остатка , см. Математику распределения , и [2] для распределения общей суммы НДС счета-фактуры по его позициям.
  2. ^ Случай, когда двойное округление всегда приводит к тому же значению, что и прямое округление до конечной точности, — это когда основание системы счисления нечетное.

Ссылки

  1. ^ Исайя Ланкхэм, Бруно Нахтергале , Энн Шиллинг : Линейная алгебра как введение в абстрактную математику. World Scientific, Сингапур 2016, ISBN  978-981-4730-35-8 , стр. 186.
  2. ^ Кулиш, Ульрих В. (июль 1977 г.). «Математические основы компьютерной арифметики». IEEE Transactions on Computers . C-26 (7): 610–621. doi :10.1109/TC.1977.1674893. S2CID  35883481.
  3. ^ Хайэм, Николас Джон (2002). Точность и устойчивость численных алгоритмов (2-е изд.). С. 54. doi :10.1137/1.9780898718027.ch2. ISBN 978-0-89871-521-7.
    Нивергельт, Ив (2000). «Ошибки округления, которые могут сбить ваши акции». Mathematics Magazine . 73 (1): 47–48. doi :10.1080/0025570X.2000.11996800. JSTOR  2691491.
    Куинн, Кевин (1983-11-08). "У вас когда-нибудь были проблемы с округлением цифр? У этой фондовой биржи они есть" (PDF) . Wall Street Journal .
    Лилли, Уэйн (1983-11-29). "Ванкуверский фондовый индекс наконец-то имеет правильные цифры" (PDF) . The Toronto Star .
  4. ^ ab "java.math.RoundingMode". Oracle.
  5. ^ ab "decimal – Десятичная арифметика с фиксированной и плавающей точкой". Python Software Foundation.
  6. ^ Руководство по стандартам инженерного проектирования (НАСА), X-673-64-1F, стр. 90
  7. ^ Эббс, Брайан; Баркер, Крис; Фриберн, Ингрид (2003). Открытки 4 Language Booster: рабочая тетрадь с Grammar Builder . Pearson Education. стр. 85. ISBN 0-13-093904-8Округление до ближайшего четного числа также называется «банковским округлением», поскольку банки также используют этот прием.
    Руководство пользователя компилятора Microsoft Pascal для операционной системы MS-DOS . Корпорация Microsoft. 1985. С. 165. Банковское округление используется при усечении действительных чисел, заканчивающихся на .5; то есть нечетные числа округляются вверх до четного целого числа, четные числа округляются вниз до четного целого числа.
  8. ^ Приложение 1 к Закону о десятичной денежной системе 1969 года
  9. ^ Принципы работы IBM z/Architecture
  10. ^ ab Gupta, Suyog; Angrawl, Ankur; Gopalakrishnan, Kailash; Narayanan, Pritish (2016-02-09). «Глубокое обучение с ограниченной числовой точностью». стр. 3. arXiv : 1502.02551 [cs.LG].
  11. ^ "Регуляторы напряжения на стабилитронах" (PDF) . Архивировано (PDF) из оригинала 2011-07-13 . Получено 2010-11-24 .
  12. ^ «Создание зеркального тестера»
  13. ^ Брюс Трамп, Кристин Шнайдер. «Формула Excel вычисляет стандартные значения резисторов с точностью 1%». Electronic Design , 21.01.2002. [1]
  14. ^ Паркер, Д. Стотт; Эггерт, Пол Р.; Пирс, Брэд (2000-03-28). «Арифметика Монте-Карло: структура для статистического анализа ошибок округления». IEEE Computation in Science and Engineering.
  15. ^ Борман, Фил; Чатфилд, Мэрион (2015-11-10). «Избегайте опасностей использования округленных данных». Журнал фармацевтического и биомедицинского анализа . 115 : 506–507. doi :10.1016/j.jpba.2015.07.021. PMID  26299526.
  16. ^ Дебора Р. Хенслер (2000). Дилеммы групповых исков: преследование общественных целей ради личной выгоды . RAND. С. 255–293. ISBN 0-8330-2601-1.
  17. ^ Сэмюэл А. Фигероа (июль 1995 г.). «Когда двойное округление безвредно?». Информационный бюллетень ACM SIGNUM . 30 (3). ACM: 21–25. doi : 10.1145/221332.221334 . S2CID  14829295.
  18. ^ Роджер Голливер (октябрь 1998 г.). «Эффективное создание стандартных ортогональных двойных результатов IEEE с использованием расширенного оборудования IEEE» (PDF) . Intel.
  19. ^ Дарси, Джозеф Д. "JEP 306: Восстановление всегда строгой семантики чисел с плавающей точкой" . Получено 12 сентября 2021 г.
  20. ^ Мур, Дж. Стротер; Линч, Том; Кауфманн, Мэтт (1996). «Механически проверенное доказательство корректности ядра алгоритма деления с плавающей точкой AMD5K86» (PDF) . IEEE Transactions on Computers . 47 . CiteSeerX 10.1.1.43.3309 . doi :10.1109/12.713311 . Получено 02.08.2016 . 
  21. ^ Больдо, Сильви ; Мелькион, Гийом (2008). «Эмуляция FMA и правильно округленные суммы: доказанные алгоритмы с использованием округления до нечетного» (PDF) . IEEE Transactions on Computers . 57 (4): 462–471. doi :10.1109/TC.2007.70819. S2CID  1850330. Получено 2016-08-02 .
  22. ^ "21718 – округление real.c не идеально". gcc.gnu.org .
  23. ^ Кахан, Уильям Мортон . "Логарифм, слишком умный наполовину" . Получено 14 ноября 2008 г.
  24. ^ Мюллер, Жан-Мишель; Бризебар, Николя; де Динешен, Флоран; Жаннерод, Клод-Пьер; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Стеле, Дэмиен; Торрес, Серж (2010). «Глава 12: Решение дилеммы столовщика». Справочник по арифметике с плавающей запятой (1-е изд.). Биркхойзер . дои : 10.1007/978-0-8176-4705-6. ISBN 978-0-8176-4704-9. LCCN  2009939668.
  25. ^ "NA Digest Sunday, April 18, 1999 Volume 99: Issue 16". 1999-04-18 . Получено 2022-08-29 .
  26. ^ "Математическая библиотека для Java". Архивировано из оригинала 1999-05-08.
  27. ^ "Точная портативная математическая библиотека". Архивировано из оригинала 2005-02-07.
  28. ^ mathlib на GitHub .
  29. ^ "libultim – окончательная правильно-округленная библиотека элементарных функций". Архивировано из оригинала 2021-03-01.
  30. ^ "Git - glibc.git/commit". Sourceware.org . Получено 2022-07-18 .
  31. ^ de Dinechin, Florent; Lauter, Christoph; Muller, Jean-Michel (январь–март 2007 г.). «Быстрые и правильно округленные логарифмы с двойной точностью». RAIRO-Theor. Inf. Appl . 41 (1): 85–102. CiteSeerX 10.1.1.106.6652 . doi :10.1051/ita:2007003. HAL  ensl-00000007v2. 
  32. ^ "CRlibm – Корректно округленная математическая библиотека". Архивировано из оригинала 2016-10-27.
  33. ^ crlibm на GitHub
  34. ^ ab Сибиданов, Алексей; Циммерман, Пол; Глонду, Стефан (2022). Проект CORE-MATH. 29-й симпозиум IEEE по компьютерной арифметике (ARITH 2022) . Получено 30 августа 2022 г.
  35. ^ Куприянова, Ольга; Лаутер, Кристоф (2014). Metalibm: Генератор кода математических функций. Математическое программное обеспечение – ICMS 2014. Т. 8592. С. 713–717. doi :10.1007/978-3-662-44199-2_106.
  36. ^ "libmcr – правильно округленная библиотека элементарных функций". Архивировано из оригинала 25.02.2021.
  37. ^ libmcr на GitHub .
  38. ^ "Проект CORE-MATH" . Получено 2022-08-30 .
  39. ^ «Математические функции — библиотека LLVM C». libc.llvm.org .
  40. ^ Дункан Дж. Мелвилл. "YBC 7289 глиняная табличка". 2006
  41. ^ Правила округления числовых значений . Американская ассоциация стандартов . 1940. Z25.1-1940.
    Стандарт возник из работы комитета ASA по стандартизации преобразования дюймов в миллиметры. См.: Agnew, PG (сентябрь 1940 г.). "Man's Love Of Round Numbers". Industrial Standardization and Commercial Standards Monthly . Vol. 11, no. 9. pp. 230–233.
    Стандарт также был более кратко представлен в: «Округление десятичных дробей». Power . Vol. 84, no. 11. Nov 1940. p. 93.
    Стандартная практика использования значащих цифр в данных испытаний для определения соответствия спецификациям . ASTM. 2013 [1940]. doi :10.1520/E0029-13. E-29.
  42. ^ Вудворд, Роберт С. (1906). Вероятность и теория ошибок. Математические монографии. Т. 7. Нью-Йорк: J. Wiley & Son. стр. 42. Важным фактом относительно ошибки 1/2 для четного n является то, что ее знак произволен или не фиксируется вычислением, как в случае со всеми другими ошибками. Однако правило компьютера, которое делает последнюю округленную цифру интерполированного значения даже тогда, когда от половины единицы нужно избавиться, в конечном счете сделает эту ошибку как плюсовой, так и минусовой.
  43. ^ Ньюкомб, Саймон (1882). Логарифмические и другие математические таблицы с примерами их использования и советами по искусству вычислений. Нью-Йорк: Генри Холт. стр. 14–15. Здесь мы имеем случай, в котором требуется половина нечетного числа. [...] Хорошее правило, которое следует принять в таком случае, — записывать ближайшее четное число .
  44. ^ Tuttle, Lucius (1916). The Theory of Measurements. Philadelphia: Jefferson Laboratory of Physics. p. 29. Дробь, заметно меньшая половины, следует отбрасывать, а больше половины всегда следует рассматривать как еще одну единицу, но когда неясно, какая цифра ближе, общепринятым правилом является запись ближайшего четного числа, а не нечетного числа, которое находится в равной степени близко. Причина этой процедуры в том, что в серии нескольких измерений одной и той же величины запись будет как слишком большой, так и слишком маленькой, и поэтому в среднем из нескольких таких значений будет возникать лишь небольшая ошибка, если таковая вообще будет.
  45. ^ Черчилль Эйзенхарт (1947). «Эффекты округления или группировки данных». В Eisenhart; Hastay; Wallis (ред.). Selected Techniques of Statistical Analysis for Scientific and Industrial Research, and Production and Management Engineering . New York: McGraw-Hill. стр. 187–223 . Получено 30.01.2014 .
  46. ^ "Введение евро и округление валютных сумм" (PDF) . Архивировано (PDF) из оригинала 2010-10-09 . Получено 2011-08-19 .
  47. ^ Батен, Йорг (2009). «Количественная оценка грамотности: накопление возраста и история человеческого капитала» (PDF) . Журнал экономической истории . 69 (3): 783–808. doi : 10.1017/S0022050709001120. hdl : 10230/481 . S2CID  35494384.
  48. ^ "Спецификация языка ECMA-262 ECMAScript" (PDF) . ecma-international.org .
  49. OFCM, 2005: Федеральный метеорологический справочник № 1. Архивировано 20 апреля 1999 г. в Wayback Machine , Вашингтон, округ Колумбия, 104 стр.

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