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



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

Date: 2014-12-13 01:10 am (UTC)
vak: (Default)
From: [personal profile] vak
Да, интересно бы посмотреть.
Для всех четырех режимов округления.

Date: 2014-12-13 04:39 am (UTC)
vak: (Default)
From: [personal profile] vak
Получается в 14.9% случаев результат меньше единицы, и никогда больше. Это при стандартном округлении к ближайшему. Типа такого:
49: result 3fefffffffffffff
103: result 3fefffffffffffff
107: result 3fefffffffffffff
161: result 3fefffffffffffff
187: result 3fefffffffffffff
197: result 3fefffffffffffff
237: result 3fefffffffffffff
239: result 3fefffffffffffff
249: result 3fefffffffffffff
253: result 3fefffffffffffff
347: result 3fefffffffffffff
389: result 3fefffffffffffff

Date: 2014-12-13 04:52 am (UTC)
vak: (Default)
From: [personal profile] vak
Тогда результат всегда точным получается.

Date: 2014-12-13 06:12 am (UTC)
vak: (Default)
From: [personal profile] vak
Непонятно, откуда такая разница.

Date: 2014-12-13 06:33 am (UTC)
vak: (Default)
From: [personal profile] vak
Что-то компилятор там мудрит.

Date: 2014-12-13 01:43 am (UTC)
From: [identity profile] archaicos.livejournal.com
Все это Сильно зависит от компилятора и опций. Промежуточные результаты могут храниться с большей точностью. Плюс ошибки в компиляторе. Кроме того нужно помнить про денормализованные числа вблизи нуля - у них меньше значащих разрядов, чем обычно. Там веселуха, короче.
Page generated Mar. 5th, 2026 12:56 pm
Powered by Dreamwidth Studios