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



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

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

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

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 05:22 am (UTC)
vak: (Default)
From: [personal profile] vak
Да вроде нет, тоже 14.9%.
Вот исходник: https://code.google.com/p/vak-opensource/source/browse/trunk/languages/c-language/rounding.c

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
Что-то компилятор там мудрит.

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 5th, 2026 05:32 pm
Powered by Dreamwidth Studios