From 1469e03ecbe45c21ec83282591fdc8b90a5ebe86 Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Thu, 29 Jan 2026 18:51:37 +0100 Subject: [PATCH] [SPCA] Guard, round and sticky bit computation tricks --- .../01_c/06_floating-point/04_rounding.tex | 3 ++- semester3/spca/spca-summary.pdf | Bin 792856 -> 793068 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/semester3/spca/parts/01_c/06_floating-point/04_rounding.tex b/semester3/spca/parts/01_c/06_floating-point/04_rounding.tex index 298aba1..e7f7bf2 100644 --- a/semester3/spca/parts/01_c/06_floating-point/04_rounding.tex +++ b/semester3/spca/parts/01_c/06_floating-point/04_rounding.tex @@ -17,11 +17,12 @@ $$ \underbrace{X_1X_2\ldots X_{k - 1}X_k}_\text{Sticky} $$ where $n$ is the number of bits in the mantissa of the format (e.g. $3$ as in the above example of an $8$bit floating point number). +Do keep in mind that when computing them in \lC\ in the standard way, they are inverted, i.e. we need a \texttt{!= 0} at the end to correct. \begin{enumerate} \item \textbf{Guard Bit} $G$ is the least significant bit of the (rounded) result (i.e. it is $B_n$) \item \textbf{Round Bit} $R$ is the $1$st bit cut off after rounding - \item \textbf{Sticky Bit} $S$ is the logical OR of all remaining cut off bits $X_i$. + \item \textbf{Sticky Bit} $S$ is the logical OR of all remaining cut off bits $X_i$. The mask can be computed using \texttt{(1 << n) - 1} \end{enumerate} Based on these bits the rounding can be decided (we increment the rounded part if the expression evaluates to true): diff --git a/semester3/spca/spca-summary.pdf b/semester3/spca/spca-summary.pdf index 1c6b03162053878ea15962d79de732d72f33c6d8..a07da5de3f8c8514ff422f336deabcb5c7ff2040 100644 GIT binary patch delta 8349 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 delta 8191 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 PLcF}#jEr&`^4R|es&Q&S