C - округление с плавающей точкой

Я пытаюсь понять, как работают числа с плавающей точкой.

Я думаю, что хотел бы проверить то, что я знаю / должен учиться путем оценки следующего: Я хотел бы найти самое маленькое x таким образом, что x + 1 = x, где x число с плавающей точкой.

Насколько я понимаю это произошло бы в случае где x является достаточно большим так, чтобы x + 1 ближе к x, чем следующее число выше, чем x представимый плавающей точкой. Так интуитивно кажется, что имело бы место, где у меня нет достаточного количества цифр в мантиссе. Был бы этот номер x затем быть числом, где мантисса - все 1's. Но затем я, может казаться, не выясняю, какова экспонента должна была бы быть. Очевидно, это должно было бы быть большим (относительно 10^0, так или иначе).

6
задан Tony Stark 3 May 2010 в 08:46
поделиться

3 ответа

Вам просто нужно выражение для значения LS-бита в мантиссе в терминах экспоненты. Если он> 1, значит, вы выполнили свое условие. Для числа с плавающей запятой одинарной точности бит LS имеет значение 2 ^ -24 * 2 ^ exp, поэтому условие будет выполняться, когда exp> 24, то есть 25. Таким образом, наименьшее (нормализованное) число, при котором будет выполняться это условие, будет быть 1.0 * 2 ^ 25 = 33554432.0f.

Я не проверял это, поэтому мои математические вычисления могут быть где-то не так (например, в 2 раза), и также возможно, что блок FP выполняет округление за пределами 24-го бита, поэтому может потребоваться дополнительный коэффициент в 2 чтобы учесть это, но вы поняли общую идею ...

5
ответ дан 17 December 2019 в 04:43
поделиться

Начните с 1.0 и продолжайте удваивать его до тех пор, пока тест не будет успешным:

double x;
for (x = 1.0; x + 1 != x; x *= 2) { }
printf("%g + 1 = %g\n", x, x + 1);
0
ответ дан 17 December 2019 в 04:43
поделиться

Я предлагаю, чтобы, пытаясь понять числа f-p и арифметику f-p, вы работали с десятичными числами с 5 знаками в мантиссе и 2 в показателе степени. (Или, если 5 и 2 вам не подходят, 6 и 3 или любые другие маленькие числа, которые вам нравятся.) Проблемы:

  • ограниченный набор чисел, которые могут быть представлены;
  • некоммутативность, неассоциативность и недистрибутивность;
  • проблемы, которые могут возникнуть при рассмотрении чисел fp как действительных чисел;

все намного легче вычислить в десятичном формате, и уроки, которые вы усвоите, полностью Общее. Как только вы это поймете, расширить свои знания с помощью арифметики IEEE f-p будет относительно просто. Вы также сможете относительно легко вычислить другие арифметические системы f-p.

0
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: