<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>fpchecker-doc</title>
        <description>Intended as a documentation theme based on Jekyll for technical writers documenting software and other technical products, this theme has all the elements you would need to handle multiple products with both multi-level sidebar navigation, tags, and other documentation features.</description>
        <link>https://fpchecker.org/</link>
        <atom:link href="https://fpchecker.org/feed.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Mon, 01 Jun 2026 16:25:10 +0000</pubDate>
        <lastBuildDate>Mon, 01 Jun 2026 16:25:10 +0000</lastBuildDate>
        <generator>Jekyll v3.10.0</generator>
        
        <item>
            <title>Floating-point Exceptions and GPU Applications</title>
            <description>&lt;p&gt;A floating-point exception occurs when an attempted arithmetic operation produces an abnormal result. For example, an exception arises when a program attempts to compute the square root of a negative number or when a division by zero occurs.&lt;/p&gt;

&lt;p&gt;In traditional CPU-based programming languages and system software, several methods exist to detect floating-point exceptions. For example, in Linux systems, when exceptions occur, one of two things can happen. By default, the exception is simply noted in the floating-point status word, and the program can check the status word to find out which exceptions happened. Alternatively, traps for exceptions can be enabled, enabling the program to receive the SIGFPE signal (see &lt;a href=&quot;https://www.gnu.org/software/libc/manual/html_node/FP-Exceptions.html&quot;&gt;this&lt;/a&gt;). The default action for this signal is to terminate the program, but the effect of the signal can be changed.&lt;/p&gt;

&lt;p&gt;GPUs are quickly dominating the HPC market and are becoming pervasive in the largest supercomputers. However, the support to detect floating-point exceptions in GPUs is sometimes limited and, in some cases, null. For example, NVIDIA GPUs have no mechanism to detect that a floating-point exception occurred according to the CUDA Programming Guide [1] version 11.&lt;/p&gt;

&lt;p&gt;The CUDA Programming Guide also states other deviations of the CUDA implementation of floating-point arithmetic concerning the IEEE-754 standard, including that double-precision floating-point absolute value and negation are not compliant with IEEE-754 with respect to NaNs.&lt;/p&gt;

&lt;h2 id=&quot;detecting-exceptions-in-cuda&quot;&gt;Detecting Exceptions in CUDA&lt;/h2&gt;

&lt;p&gt;Since the traditional mechanisms to detect floating-point exceptions don’t exist in CUDA, programmers are left with almost no option other than using printf statements in the application source code to catch the result of exceptions. Printing out the results of computations makes sense because the result of exceptions—infinity and NaN—propagate quickly to other calculations. For example, 2 x ∞ = ∞. So there is a good chance of observing such results in the application’s output.&lt;/p&gt;

&lt;figure&gt;&lt;img class=&quot;docimage&quot; src=&quot;images/fpchecker/gpu-1.jpg&quot; alt=&quot;GPU&quot; style=&quot;max-width: 400px&quot; /&gt;&lt;figcaption&gt;Photo by Nana Dua on Unspalsh.com&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;A significant downside is that printing in standard output from millions of GPU threads can be slow and error-prone. For example, some exceptions can be miss-detected, and they can affect control-flow without programmers even noticing them.&lt;/p&gt;

&lt;h2 id=&quot;fpchecker-detection&quot;&gt;FPChecker Detection&lt;/h2&gt;
&lt;p&gt;FPChecker can detect the result of exceptions in CUDA (and in the CPU code). For example, the tool detects operations that produce NaN, positive infinity, negative infinity, and subnormal numbers (underflows). Furthermore, it informs programmers of the location of the exception (file and line of code) and the first CUDA thread that encounters the exception. This information can be used in combination with a debugger to understand the origin of the error.&lt;/p&gt;

&lt;p&gt;Mitigating floating-point exception often involves a deep understanding of the application’s algorithm, the modification of inputs, and adding if/then conditions in the code to deal with specific quantities—for example, if the denominator of a division is zero, some different action may be needed.&lt;/p&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;p&gt;[1] CUDA C++ Programming Guide: &lt;a href=&quot;https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html&quot;&gt;https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html&lt;/a&gt;&lt;/p&gt;

</description>
            <pubDate>Mon, 19 Jul 2021 00:00:00 +0000</pubDate>
            <link>https://fpchecker.org/2021-07-12-exceptions.html</link>
            <guid isPermaLink="true">https://fpchecker.org/2021-07-12-exceptions.html</guid>
            
            <category>errors</category>
            
            <category>exceptions</category>
            
            
        </item>
        
        <item>
            <title>What can be Done About Floating-Point Cancellation</title>
            <description>&lt;figure&gt;&lt;img class=&quot;docimage&quot; src=&quot;images/fpchecker/Rayleigh-Taylor_instability.jpg&quot; alt=&quot;&quot; style=&quot;max-width: 300px&quot; /&gt;&lt;figcaption&gt;Scientific visualization of a very large simulation of a Rayleigh–Taylor instability problem.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;One of the difficulties of dealing with floating-point arithmetic arises when subtracting numbers. When we subtract nearby quantities, the most significant digits in the operands match and cancel each other. This is called cancellation.&lt;/p&gt;

&lt;h2 id=&quot;example-of-cancellation&quot;&gt;Example of Cancellation&lt;/h2&gt;
&lt;p&gt;Let’s look at an example. Suppose we have two quantities, &lt;strong&gt;a&lt;/strong&gt; and &lt;strong&gt;b&lt;/strong&gt;:&lt;/p&gt;

&lt;figure&gt;&lt;img class=&quot;docimage&quot; src=&quot;images/fpchecker/cancellation_input.png&quot; alt=&quot;fpchecker&quot; style=&quot;max-width: 275px&quot; /&gt;&lt;/figure&gt;

&lt;p&gt;where &lt;strong&gt;x&lt;/strong&gt;, &lt;strong&gt;m&lt;/strong&gt;, and &lt;strong&gt;n&lt;/strong&gt; are decimal digits. Suppose that due to the available precision in the system, we can only store the 12 most significant digits. As a result, when &lt;strong&gt;a&lt;/strong&gt; and &lt;strong&gt;b&lt;/strong&gt; are stored, the &lt;strong&gt;mmm…&lt;/strong&gt; and &lt;strong&gt;nnn…&lt;/strong&gt; digits are lost.&lt;/p&gt;

&lt;p&gt;If we compute &lt;strong&gt;c = a – b&lt;/strong&gt;, the result has only one significant digit:&lt;/p&gt;

&lt;figure&gt;&lt;img class=&quot;docimage&quot; src=&quot;images/fpchecker/cancellation.png&quot; alt=&quot;fpchecker&quot; style=&quot;max-width: 300px&quot; /&gt;&lt;/figure&gt;

&lt;p&gt;The values for the &lt;strong&gt;uuu…&lt;/strong&gt; digits are not necessarily zero. Therefore, the relative error of the result can be significant.
The above is an example of catastrophic cancellation, which occurs because the original quantities &lt;strong&gt;a&lt;/strong&gt; and &lt;strong&gt;b&lt;/strong&gt; were not represented exactly with the available precision of the system. On the other hand, suppose the &lt;strong&gt;a&lt;/strong&gt; and &lt;strong&gt;b&lt;/strong&gt; quantities are exactly represented as floating-point numbers in the available precision. In that case, cancellation can occur, but it is considered benign (i.e., the result of the subtraction is exact).&lt;/p&gt;

&lt;h2 id=&quot;what-can-be-done&quot;&gt;What Can be Done?&lt;/h2&gt;

&lt;p&gt;Avoiding cancellation can be a challenge depending on the problem being solved by the application. In some cases, rearranging the mathematical formulas can remove the problem. The paper &lt;em&gt;What Every Computer Scientist Should Know About Floating-Point Arithmetic&lt;/em&gt; [1] gives an example of how rearranging formulas helps.&lt;/p&gt;

&lt;p&gt;Sometimes algorithmic changes or input changes are required to avoid cancellation (see [2]). In many applications, however, it’s almost impossible to remove cancellation, and programmers must embrace it and develop a solid testing infrastructure to deal with the numerical inconsistencies and errors it may yield.&lt;/p&gt;

&lt;h2 id=&quot;cancellation-detection-in-fpchecker&quot;&gt;Cancellation Detection in FPChecker&lt;/h2&gt;

&lt;p&gt;Cancellation is almost inevitable in scientific applications, and it occurs very frequently. For example, many numerical methods in HPC rely on calculating differences of quantities, which often suffer from cancellation.&lt;/p&gt;

&lt;p&gt;Because of its prevalence in scientific codes, FPChecker detects cancellation only when many digits are lost in a subtraction instruction. Therefore, FPChecker only reports cancellation when at least 10 decimal digits are lost; however, this threshold can be adjusted.&lt;/p&gt;

&lt;h2 id=&quot;references&quot;&gt;References&lt;/h2&gt;

&lt;p&gt;[1] Goldberg, David. &lt;a href=&quot;https://dl.acm.org/doi/abs/10.1145/103162.103163&quot;&gt;“What every computer scientist should know about floating-point arithmetic.”&lt;/a&gt; ACM computing surveys (CSUR) 23, no. 1 (1991): 5-48.&lt;/p&gt;

&lt;p&gt;[2] Lee, Sang-Hyeon. &lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S0021999109002162&quot;&gt;“Alleviation of cancellation problem of preconditioned Navier–Stokes equations.”&lt;/a&gt; Journal of Computational Physics 228, no. 14 (2009): 4970-4975.&lt;/p&gt;
</description>
            <pubDate>Mon, 12 Jul 2021 00:00:00 +0000</pubDate>
            <link>https://fpchecker.org/2021-07-12-dealing-with-cancellation.html</link>
            <guid isPermaLink="true">https://fpchecker.org/2021-07-12-dealing-with-cancellation.html</guid>
            
            <category>errors</category>
            
            <category>cancellation</category>
            
            
        </item>
        
        <item>
            <title>Subnormal Numbers and Compiler Optimizations: A Dangerous Combination</title>
            <description>&lt;p&gt;Subnormal numbers (previously known as denormal numbers) fill the underflow gap in floating-point arithmetic. Traditionally, an underflow computation is said to occur when the exact result of the calculation is nonzero but is smaller than the smallest normalized floating-point number. Subnormal numbers represent the result of computations that produce very small numbers but are not too small to become zero.&lt;/p&gt;

&lt;p&gt;While subnormal numbers are generated frequently in numerical software, combining such numbers with specific compiler optimizations can produce unexpected results.&lt;/p&gt;

&lt;h2 id=&quot;simple-example&quot;&gt;Simple Example&lt;/h2&gt;
&lt;p&gt;Let’s examine an simple example where combining subnormal numbers and compiler optimizations produce inconsistencies.&lt;/p&gt;

&lt;p&gt;Consider the following function that executes a division operation and makes a decision based on the result of the division:&lt;/p&gt;
&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Correct branch&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; 
  &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Incorrect branch!!&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Compiling the code on an x86_64 system with the clang compiler and optimization level &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-O3&lt;/code&gt; (with and without the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–ffast-math&lt;/code&gt; option), produces the expected result. If we use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1.1e-311&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;2.0e-309&lt;/code&gt; for the input of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt;, the division produces &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0.005499999999998974&lt;/code&gt;, so the code prints:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ./test
Correct branch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note that the inputs &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt; are subnormal floating-point numbers, but this doesn’t change the function’s behavior.&lt;/p&gt;

&lt;p&gt;We now compile the code on a different system. We use an IBM POWER9 system and compile it with the IBM &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xlc&lt;/code&gt; compiler using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-O3&lt;/code&gt;. In this compiler, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-O3&lt;/code&gt; automatically enables the non-strict IEEE mode, similar to the optimization mode of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–ffast-math&lt;/code&gt; in the clang and gcc compilers. This time, using the same input, we get a different result:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ./test
Incorrect branch!!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;We now lower down the optimization level in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xlc&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O2&lt;/code&gt;, and this time we get the expected result:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ./test
Correct branch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;What happened? How can we have a different behavior by simply changing the optimization level from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O3&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O2&lt;/code&gt;? 
To understand what happened, we can look at the assembly code (we use the Linux objdump tool to disassemble the code). Here’s a portion of the assembly code for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O2&lt;/code&gt; case:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; 7 0000000000000000 &amp;lt;compute&amp;gt;:
 8    0: 00 00 4c 3c   addis   r2,r12,0
 9    4: 00 00 42 38   addi    r2,r2,0
10    8: 91 ff 21 f8   stdu    r1,-112(r1)
11    c: a6 02 08 7c   mflr    r0
12   10: 80 00 01 f8   std     r0,128(r1)
13   14: c0 11 01 f0   xsdivdp vs0,vs1,vs2
14   18: 00 00 82 3c   addis   r4,r2,0
15   1c: 00 00 84 e8   ld      r4,0(r4)
16   20: 8c 03 01 10   vspltisw v0,1
17   24: 78 23 83 7c   mr      r3,r4
18   28: e2 03 20 f0   xvcvsxwdp vs1,vs32
19   2c: 58 01 01 f0   xscmpodp cr0,vs1,vs0
20   30: 20 00 81 41   bgt     50 &amp;lt;compute+0x50&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The interesting thing to note in the above assembly is that the division operation is in line 13; the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xsdivdp&lt;/code&gt; instruction corresponds to a division in the POWER architecture. Let’s see now the assembly code for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-O3&lt;/code&gt; case:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; 7 0000000000000000 &amp;lt;compute&amp;gt;:
 8    0: 00 00 4c 3c   addis   r2,r12,0
 9    4: 00 00 42 38   addi    r2,r2,0
10    8: 91 ff 21 f8   stdu    r1,-112(r1)
11    c: a6 02 08 7c   mflr    r0
12   10: 80 00 01 f8   std     r0,128(r1)
13   14: 68 11 80 f0   xsredp  vs4,vs2
14   18: 00 00 62 3c   addis   r3,r2,0
15   1c: 00 00 63 e8   ld      r3,0(r3)
16   20: 8c 03 01 10   vspltisw v0,1
17   24: 78 1b 64 7c   mr      r4,r3
18   28: e2 03 00 f0   xvcvsxwdp vs0,vs32
19   2c: 38 01 62 fc   fmsub   f3,f2,f4,f0
20   30: 88 1d 84 f0   xsnmsubadp vs4,vs4,vs3
21   34: 80 21 61 f0   xsmuldp vs3,vs1,vs4
22   38: 88 19 22 f0   xsmsubadp vs1,vs2,vs3
23   3c: 88 0d 64 f0   xsnmsubadp vs3,vs4,vs1
24   40: 18 19 00 f0   xscmpudp cr0,vs0,vs3
25   44: 1c 00 81 40   ble     60 &amp;lt;compute+0x60&amp;gt;
...

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The division operation is gone with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O3&lt;/code&gt; optimization level, and it was replaced with a reciprocal operation (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xsredp&lt;/code&gt; instruction) followed by other operations, including multiplication.&lt;/p&gt;

&lt;p&gt;We see that with the higher optimization level (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-O3&lt;/code&gt;), the compiler optimizes the division operation and replaces it with potentially faster operations, which is wise and can potentially improve performance. However, this optimization makes the assumption that the inputs are represented as normal floating-point numbers.&lt;/p&gt;

&lt;p&gt;We add a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;printf(&quot;z = %.17g\n&quot;, z);&lt;/code&gt; statement to check the result of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;z&lt;/code&gt; with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O2&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O3&lt;/code&gt; cases:&lt;/p&gt;

&lt;p&gt;With &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O2&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ./test 
z = 0.0054999999999989736
Correct branch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;With &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;–O3&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ ./test
z = nan
Incorrect branch!!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The optimized code, which includes a reciprocal operation, produces a NaN; the inputs fall outside of the normal number representations (i.e., they are subnormal numbers), combined with the equivalent code produced by the optimizations results in the code taking an incorrect branch.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you are using highly optimized floating-point code, it is good to know whether your application is operating on subnormal numbers. Several numerical inconsistencies can be caused by the combination of optimized code and subnormal inputs. Knowing the functions and lines of code that use subnormal numbers is an excellent first step to understand potential numerical inconsistency issues. FPChecker can perform a complete floating-point analysis of applications and report code locations that produce subnormal numbers.&lt;/p&gt;

</description>
            <pubDate>Mon, 05 Jul 2021 00:00:00 +0000</pubDate>
            <link>https://fpchecker.org/subnormal-numbers.html</link>
            <guid isPermaLink="true">https://fpchecker.org/subnormal-numbers.html</guid>
            
            <category>subnormal numbers</category>
            
            <category>optimizations</category>
            
            
        </item>
        
    </channel>
</rss>
