<?xml version="1.0" encoding="UTF-8"?> <section version="5.0" xml:id="sd1_exam_2024_summer" xml:lang="en" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:trans="http://docbook.org/ns/transclusion" xmlns:svg="http://www.w3.org/2000/svg" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:db="http://docbook.org/ns/docbook"> <title>SD1 examination summer 2024</title> <section xml:id="sd1_exam_2024_summer_task1"> <title>Implementing tasks</title> <section xml:id="sd1_exam_2024_summer_task1_preparation"> <title>Preparation</title> <orderedlist> <listitem> <para>Download and unzip the above file <filename>exam.zip</filename>. You should see a directory »<filename>Exam</filename>« containing a <filename>pom.xml</filename> file.</para> </listitem> <listitem> <para>Open this project in your <productname>IDEA</productname> IDE by selecting the <filename>Exam/pom.xml</filename> file.</para> </listitem> </orderedlist> </section> <section xml:id="sd1_exam_2024_summer_task1_task"> <title>Task</title> <qandaset defaultlabel="qanda" xml:id="sd1_exam_2024_summer_task1Qanda"> <qandadiv> <qandaentry> <question> <para>Open the <filename>Readme.md</filename> file in your project's root. It contains all necessary instructions for solving the implementation tasks.</para> </question> <answer> <para>Solution see <link xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/-/tree/master/Klausuren/Sd1/2023winter/Solve">winter 2022 exam</link>.</para> </answer> </qandaentry> </qandadiv> </qandaset> </section> <section xml:id="sd1_exam_2024_summer_task1Caveats"> <title>Caveats</title> <itemizedlist> <listitem> <para>When approaching end of examination check your input for completeness prior to being automatically logged out by the system. Remember: There is 120 minutes for the examination and another 5 minutes to check for completeness.</para> </listitem> <listitem> <para>Projects residing just on your local workstation's file system cannot be recovered after finishing the exam.</para> </listitem> </itemizedlist> </section> </section> <section xml:id="sd1_exam_2024_summer_task2"> <title>Executing main(...)</title> <qandaset defaultlabel="qanda" xml:id="sd1_exam_2024_summer_task3Qanda"> <qandadiv> <qandaentry> <question> <para>Executing the following program</para> <programlisting language="none"><emphasis role="red">01</emphasis> public class LackingInit { <emphasis role="red">02</emphasis> ... <emphasis role="red">03</emphasis> public static void main(String[] args) { <emphasis role="red">04</emphasis> main(args); <emphasis role="red">05</emphasis> } <emphasis role="red">06</emphasis> ...</programlisting> <para>yields:</para> <screen>Exception in thread "main" java.lang.<link xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/StackOverflowError.html">StackOverflowError</link> at de.hdm_stuttgart.mi.sd1.extra.LackingInit.main(LackingInit.java:4) at de.hdm_stuttgart.mi.sd1.extra.LackingInit.main(LackingInit.java:4) <emphasis role="red">... 1020 more identical lines omitted for brevity ...</emphasis> at de.hdm_stuttgart.mi.sd1.extra.LackingInit.main(LackingInit.java:4) at de.hdm_stuttgart.mi.sd1.extra.LackingInit.main(LackingInit.java:4) Process finished with exit code 1</screen> <para>What's happening here? Why is execution being terminated by an exception?</para> </question> <answer> <para>Our <methodname>main(...)</methodname> method calls itself recursively until breaching the JVM's limit resulting in the observed <link xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/StackOverflowError.html">StackOverflowError</link> exception.</para> </answer> </qandaentry> </qandadiv> </qandaset> </section> <section xml:id="sd1_exam_2024_summer_task3"> <title>Strange arithmetics</title> <qandaset defaultlabel="qanda" xml:id="sd1_exam_2024_summer_task2Qanda"> <qandadiv> <qandaentry> <question> <para>From ordinary arithmetics we expect a + b - c = a - c + b. But executing the subsequent code yields:</para> <informaltable border="1"> <tr> <th>Code</th> <th>Output</th> </tr> <tr> <td valign="top"><programlisting language="java">System.out.println(1000000000 + 0.000000001 - 1000000000); System.out.println(1000000000 - 1000000000 + 0.000000001);</programlisting></td> <td valign="top"><screen>0.0 1.0E-9</screen></td> </tr> </informaltable> <para>Explain these two different results.</para> </question> <answer> <para>Short answer: The two values 1000000000 or <inlineequation> <m:math display="inline"> <m:msup> <m:mi>10</m:mi> <m:mi>9</m:mi> </m:msup> </m:math> </inlineequation>and 0.000000001 or <inlineequation> <m:math display="inline"> <m:msup> <m:mi>10</m:mi> <m:mi>-9</m:mi> </m:msup> </m:math> </inlineequation> differ by 18 orders of magnitude. An eight byte <code language="java">double</code> cannot express enough digits for expressing this.</para> <para>Longer answer: For summing up the int literal <code language="java">1000000000</code> gets being converted into a <code language="java">double</code> value being represented as 8 byte IEEE 754. Due to its inherently limited precision the above sums gets truncated. We consider:</para> <informaltable border="1"> <tr> <th>Code</th> <th>Output</th> </tr> <tr> <td valign="top"><programlisting language="java">System.out.println(1000000000 == 1000000000 + 0.000000001);</programlisting></td> <td valign="top"><screen>true</screen></td> </tr> <tr> <td valign="top"><programlisting language="java">System.out.println(1000000000.0 == 1000000000 + 0.000000001);</programlisting></td> <td valign="top"><screen>true</screen></td> </tr> </informaltable> <para>Thus in 8 byte IEEE 754 representation both <code language="java">1000000000.0</code> and the expression <code language="java">1000000000 + 0.000000001</code> amount to the exact same value. Evaluating from left to right we thus have:</para> <itemizedlist> <listitem> <para><code language="java">1000000000 + 0.000000001 - 1000000000</code> = <code language="java">1000000000.0 - 1000000000</code> = <code language="java">0.0</code>.</para> </listitem> <listitem> <para>Since <code language="java">1000000000</code> is an <code language="java">int</code> literal we have <code language="java">1000000000 - 1000000000 == 0</code> and thus:</para> <para><code language="java">1000000000 - 1000000000 + 0.000000001</code> = <code language="java">0 + 0.000000001</code> = <code language="java">1.0E-9</code>.</para> </listitem> </itemizedlist> </answer> </qandaentry> </qandadiv> </qandaset> </section> </section>