Вычислительная машина должна вычислять
Dec. 6th, 2018 09:51 amЗагадка для программистов (не для математиков, потому что числа с плавающей точкой выше их понимания):
Пусть T - некий тип чисел с плавающей точкой, и a, b, s, t, z - переменные типа Т.
Дана последовательность операторов
s := a + b
z := s - a
t := b - z
Чему равно t?
Познавательная статья о том, как делаются вычисления с плавающей точкой с двойной точностью, включая формальные оценки.
Пусть T - некий тип чисел с плавающей точкой, и a, b, s, t, z - переменные типа Т.
Дана последовательность операторов
s := a + b
z := s - a
t := b - z
Чему равно t?
Познавательная статья о том, как делаются вычисления с плавающей точкой с двойной точностью, включая формальные оценки.
no subject
Date: 2018-12-06 07:12 pm (UTC)От компилятора зависит
Date: 2018-12-06 07:38 pm (UTC)no subject
Date: 2018-12-06 08:06 pm (UTC)Re: От компилятора зависит
Date: 2018-12-06 08:10 pm (UTC)double f(double a, double b) { double s = a + b; double z = s - a; return b - z; }делает
movapd %xmm0, %xmm2 addsd %xmm1, %xmm2 subsd %xmm0, %xmm2 subsd %xmm2, %xmm1 movapd %xmm1, %xmm0 retБез обмана. По-видимому, стандарт запрещает подобные оптимизации, по крайней мере по умолчанию, иначе было бы очень трудно писать алгоритмы, связанные с увеличением точности.
no subject
Date: 2018-12-06 09:38 pm (UTC)Между 0 и b (ну или между -b и 0)?
Эх... Ведь не сделать же число больше по модулю, чем b?
no subject
Date: 2018-12-06 09:46 pm (UTC)Re: От компилятора зависит
Date: 2018-12-06 10:07 pm (UTC)Re: От компилятора зависит
Date: 2018-12-06 10:47 pm (UTC)Как зачем?
Date: 2018-12-06 10:50 pm (UTC)no subject
Date: 2018-12-06 10:52 pm (UTC)no subject
Date: 2018-12-07 12:25 am (UTC)Кстати, знаменитая в свое время в определенных кругах программа PARANOIA правильно определяет основание и точность плавающей точки при трёх из четырех видов округления, а при округлении вверх (fesetround(FE_UPWARD)) с ума сходит.
Re: Как зачем?
Date: 2018-12-07 12:26 am (UTC)Возможны варианты
Date: 2018-12-07 01:18 am (UTC)А если рассчитывать на поимку всяких переполнений таким образом, так это лучше явно писать, чтоб ясно было будущему поколению.
no subject
Date: 2018-12-07 01:55 am (UTC)no subject
Date: 2018-12-07 03:13 am (UTC)Re: Возможны варианты
Date: 2018-12-07 03:15 am (UTC)no subject
Date: 2018-12-07 05:50 am (UTC)Ну по математике должен быть нуль и это неинтересно.
Крайние случаи:
В промежуточных случаях, если порядки a и b отличаются менее чем на ширину мантиссы:
no subject
Date: 2018-12-07 05:53 am (UTC)no subject
Date: 2018-12-26 02:23 am (UTC)