Я пытаюсь понять, как работают числа с плавающей точкой.
Я думаю, что хотел бы проверить то, что я знаю / должен учиться путем оценки следующего: Я хотел бы найти самое маленькое x
таким образом, что x + 1 = x
, где x
число с плавающей точкой.
Насколько я понимаю это произошло бы в случае где x
является достаточно большим так, чтобы x + 1
ближе к x, чем следующее число выше, чем x представимый плавающей точкой. Так интуитивно кажется, что имело бы место, где у меня нет достаточного количества цифр в мантиссе. Был бы этот номер x затем быть числом, где мантисса - все 1's. Но затем я, может казаться, не выясняю, какова экспонента должна была бы быть. Очевидно, это должно было бы быть большим (относительно 10^0, так или иначе).
Вам просто нужно выражение для значения LS-бита в мантиссе в терминах экспоненты. Если он> 1, значит, вы выполнили свое условие. Для числа с плавающей запятой одинарной точности бит LS имеет значение 2 ^ -24 * 2 ^ exp, поэтому условие будет выполняться, когда exp> 24, то есть 25. Таким образом, наименьшее (нормализованное) число, при котором будет выполняться это условие, будет быть 1.0 * 2 ^ 25 = 33554432.0f.
Я не проверял это, поэтому мои математические вычисления могут быть где-то не так (например, в 2 раза), и также возможно, что блок FP выполняет округление за пределами 24-го бита, поэтому может потребоваться дополнительный коэффициент в 2 чтобы учесть это, но вы поняли общую идею ...
Начните с 1.0 и продолжайте удваивать его до тех пор, пока тест не будет успешным:
double x;
for (x = 1.0; x + 1 != x; x *= 2) { }
printf("%g + 1 = %g\n", x, x + 1);
Я предлагаю, чтобы, пытаясь понять числа f-p и арифметику f-p, вы работали с десятичными числами с 5 знаками в мантиссе и 2 в показателе степени. (Или, если 5 и 2 вам не подходят, 6 и 3 или любые другие маленькие числа, которые вам нравятся.) Проблемы:
все намного легче вычислить в десятичном формате, и уроки, которые вы усвоите, полностью Общее. Как только вы это поймете, расширить свои знания с помощью арифметики IEEE f-p будет относительно просто. Вы также сможете относительно легко вычислить другие арифметические системы f-p.