C - округление с плавающей точкой - PullRequest
6 голосов
/ 03 мая 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 03 мая 2010

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

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

0 голосов
/ 03 мая 2010

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

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

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

0 голосов
/ 03 мая 2010

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

double x;
for (x = 1.0; x + 1 != x; x *= 2) { }
printf("%g + 1 = %g\n", x, x + 1);
...