spamsink: (Default)
[personal profile] spamsink
Загадка для программистов (не для математиков, потому что числа с плавающей точкой выше их понимания):

Пусть T - некий тип чисел с плавающей точкой, и a, b, s, t, z - переменные типа Т.

Дана последовательность операторов

s := a + b
z := s - a
t := b - z


Чему равно t?

Познавательная статья о том, как делаются вычисления с плавающей точкой с двойной точностью, включая формальные оценки.

Date: 2018-12-06 07:12 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Видимо, где-то между 0 и старшим разрядом a?

Date: 2018-12-07 01:55 am (UTC)
sab123: (Default)
From: [personal profile] sab123
Вроде если b > a, причем как раз настолько, чтобы старший разряд a был младшим разрядом b, то в z может оказаться +-1 из старшего разряда a. Или не может?

От компилятора зависит

Date: 2018-12-06 07:38 pm (UTC)
From: [personal profile] malobukov
Оптимизирующий компилятор вполне может выполнить роль математика и упростить всё до нуля.

Re: От компилятора зависит

Date: 2018-12-06 10:07 pm (UTC)
From: [personal profile] malobukov
Я поэтому и сказал «может». Если ему ключик -Ofast дать.

Как зачем?

Date: 2018-12-06 10:50 pm (UTC)
From: [personal profile] malobukov
Чтоб быстрее было. Само название ключика намекает.

Возможны варианты

Date: 2018-12-07 01:18 am (UTC)
From: [personal profile] malobukov
Такая последовательность может получиться после раскрытия темплейтов, инлайн функций или даже макросов, не к ночи будь помянуты. И ноль вполне правильный ответ, хоть и не соответствует стандарту.

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

Date: 2018-12-06 09:38 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Предполагая, что нету NaN, +=Infinity.

Между 0 и b (ну или между -b и 0)?

Эх... Ведь не сделать же число больше по модулю, чем b?

Date: 2018-12-06 10:52 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Кстати, зависит же от вида округления (их же четыре)

Date: 2018-12-07 05:50 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Ну по математике должен быть нуль и это неинтересно.

Крайние случаи:

  • Если a ≪ b, то s = b, z = b и t = 0.
  • Если b ≪ a, то s = a, z = 0 и t = b. Вроде бы.

В промежуточных случаях, если порядки a и b отличаются менее чем на ширину мантиссы:

 Aaaaaaaaaaaa                   Aaaaaaaaaaaa
+      Bbbbbbbbbbbb      +Bbbbbbbbbbbb
=AaaaaaSsssss            =BbbbbbSsssss
-Aaaaaaaaaaaa            -      Aaaaaaaaaaaa
=      Bbbbbb            =Bbbbbbbbbbbb
-      Bbbbbbbbbbbb      -Bbbbbbbbbbbb
=            bbbbbb      =           0±ε

Date: 2018-12-26 02:23 am (UTC)
pappadeux: (Default)
From: [personal profile] pappadeux
kahan summation?
Page generated Mar. 5th, 2026 10:28 am
Powered by Dreamwidth Studios