Округление или округление означает замену числа приблизительным значением , которое имеет более короткое, простое или более явное представление. Например, замена $ 23,4476 на $ 23,45 , дроби 312/937 на 1/3 или выражения √2 на 1,414 .
Округление часто применяется для получения значения, которое легче сообщать и передавать, чем исходное. Округление также может быть важным для избежания вводящего в заблуждение точного сообщения о вычисленном числе, измерении или оценке; например, количество, которое было вычислено как 123456, но известно, что оно имеет точность только в пределах нескольких сотен единиц, обычно лучше указывать как «около 123500 ».
С другой стороны, округление точных чисел приведет к некоторой ошибке округления в сообщаемом результате. Округление практически неизбежно при сообщении большого количества вычислений – особенно при делении двух чисел в целочисленной или арифметике с фиксированной точкой ; при вычислении математических функций, таких как квадратные корни , логарифмы и синусы ; или при использовании представления с плавающей точкой с фиксированным числом значащих цифр . В последовательности вычислений эти ошибки округления обычно накапливаются , и в некоторых плохо обусловленных случаях они могут сделать результат бессмысленным.
Точное округление трансцендентных математических функций затруднено, поскольку количество дополнительных цифр, которые необходимо вычислить для решения вопроса о том, округлять вверх или вниз, заранее неизвестно. Эта проблема известна как «дилемма составителя таблиц».
Округление имеет много общего с квантованием , которое происходит, когда физические величины необходимо кодировать числами или цифровыми сигналами .
Волнистый знак равенства ( ≈ , приблизительно равно ) иногда используется для обозначения округления точных чисел, например, 9,98 ≈ 10. Этот знак был введен Альфредом Джорджем Гринхиллом в 1892 году. [1]
Идеальные характеристики методов округления включают в себя:
Поскольку обычно невозможно, чтобы метод удовлетворял всем идеальным характеристикам, существует множество различных методов округления.
Как правило, округление идемпотентно ; [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 градуса (исключая), которая была округлена до целого числа. Это обозначение используется, когда отрицательный знак считается важным, независимо от того, насколько мала величина; например, при округлении температур по шкале Цельсия , где ниже нуля означает замерзание. [ необходима цитата ]
называется «банковским округлением», поскольку банки также используют этот прием.Руководство пользователя компилятора Microsoft Pascal для операционной системы MS-DOS . Корпорация Microsoft. 1985. С. 165.
Банковское округление используется при усечении действительных чисел, заканчивающихся на .5; то есть нечетные числа округляются вверх до четного целого числа, четные числа округляются вниз до четного целого числа.
Важным фактом относительно ошибки 1/2 для четного
n
является то, что ее знак произволен или не фиксируется вычислением, как в случае со всеми другими ошибками. Однако правило компьютера, которое делает последнюю округленную цифру интерполированного значения даже тогда, когда от половины единицы нужно избавиться, в конечном счете сделает эту ошибку как плюсовой, так и минусовой.
Здесь мы имеем случай, в котором требуется половина нечетного числа. [...] Хорошее правило, которое следует принять в таком случае, —
записывать ближайшее
четное
число
.
Дробь, заметно меньшая половины, следует отбрасывать, а больше половины всегда следует рассматривать как еще одну единицу, но когда неясно, какая цифра ближе, общепринятым правилом является
запись ближайшего четного числа,
а не нечетного числа, которое находится в равной степени близко. Причина этой процедуры в том, что в серии нескольких измерений одной и той же величины запись будет как слишком большой, так и слишком маленькой, и поэтому в среднем из нескольких таких значений будет возникать лишь небольшая ошибка, если таковая вообще будет.