{"id":327626,"date":"2026-07-25T00:06:31","date_gmt":"2026-07-24T22:06:31","guid":{"rendered":"https:\/\/borncity.com\/blog\/?p=327626"},"modified":"2026-07-22T17:10:12","modified_gmt":"2026-07-22T15:10:12","slug":"gnu-libc-mit-fehlern-in-funktionen-sin-etc","status":"publish","type":"post","link":"https:\/\/borncity.com\/blog\/2026\/07\/25\/gnu-libc-mit-fehlern-in-funktionen-sin-etc\/","title":{"rendered":"GNU libc mit Fehlern in Funktionen (sin etc.)"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"\" style=\"float: left; margin: 0px 10px 0px 0px; display: inline;\" title=\"Bug\" src=\"https:\/\/borncity.com\/blog\/wp-content\/uploads\/2025\/10\/bug05.jpg\" alt=\"Bug\" width=\"77\" height=\"77\" align=\"left\" border=\"0\" \/>Stefan Kanthak hat mich vor einigen Tagen auf unsch\u00f6ne Fehler in der GNU libc aufmerksam gemacht. Trigonometrische Berechnungen f\u00fchren zu fehlerhaften Werten, die weit oberhalb dessen liegen, was Mathematiker als Abweichungen gefunden und best\u00e4tigt haben.<\/p>\n<p><!--more--><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg08.met.vgwort.de\/na\/4598f0d8be8b400487db19ca9cdd4ad2\" alt=\"\" width=\"1\" height=\"1\" \/>In einer Mail schrieb Kanthak: \"Auf Unix\/POSIX-Systemen stellt die 'libc' die von C-Programmen verwendeten Standardfunktionen sowie die Schnittstelle zwischen Benutzerprogrammen und Kernel bereit. F\u00fcr mathematische (trigonometrische, transzendentale, etc.) Funktionen gibt es noch die 'libm'. Auf GNU\/Linux bzw. GNU\/*-Systemen stellt die GNU libc beides bereit.\" Laut Kanthak arbeitet\u00a0nicht nur das CERN mit der GNU libm und vertraut den Ergebnissen.<\/p>\n<h2>Die Abweichungen bei den Ergebnissen<\/h2>\n<p>Es gibt eine Dokumentation\u00a0<a href=\"https:\/\/sourceware.org\/glibc\/manual\/latest\/html_node\/Errors-in-Math-Functions.html\" target=\"_blank\" rel=\"noopener\">19.7 Errors in Math Functions<\/a>, die sich mit den Fehlern in den mathematischen Funktionen befassen. Dort hei\u00dft es u.a.<\/p>\n<blockquote><p>Errors are measured in \"units of the last place\". [&#8230;]<br \/>\n&#8230;<br \/>\nEach function with a floating-point result behaves as if it computes an infinite-precision result that is within a few ulp of the mathematically correct value of the function [&#8230;]<br \/>\n&#8230;<br \/>\nthe math testsuite only flags results larger than 9ulp (&#8230;) as errors; although most of the implementations show errors smaller than the limit.<\/p><\/blockquote>\n<p>Kanthak wies darauf hin, dass im Februar 2026 ein paar bekannte Mathematiker (u.a. Dr. Brian Gladman, Prof. Dr. Paul Zimmermann, &#8230;), die seit \u00fcber 30 Jahren mit Gleitpunkt-Arithmetik \"spielen\", eine Untersuchung zur (Un)genauigkeit verschiedener<br \/>\n\"libm\"-Implementierungen <a href=\"https:\/\/members.loria.fr\/PZimmermann\/papers\/accuracy.pdf\" target=\"_blank\" rel=\"noopener\">ver\u00f6ffentlicht<\/a>. Dort bescheinigen sie sie (fast) allen<br \/>\nmathematischen Funktionen der GNU libm einen maximalen Fehler von 0.5 ULP\u00a0bescheinigen.<\/p>\n<h2>Es gibt Diskrepanzen bei den Ergebnissen<\/h2>\n<p>Kanthak schrieb mir, dass er diese obige Untersuchung nicht kannte. Bei eigenen \"Spielereien\" (Implementation von Payne\/Hanek-Argumentreduktion) stie\u00df er binnen Minuten auf das Problem, dass die Ergebnisse gr\u00f6\u00dfer Abweichungsfehler zeigen.<\/p>\n<ul>\n<li>cos(214112296674652) weist einen Fehler von 179 ULP auf<\/li>\n<li>sin(1284673780047912) sowie<\/li>\n<li>tan(1284673780047912) weisen jeweils einen Fehler von 268 ULP auf.<\/li>\n<\/ul>\n<p>H\u00e4tte noch ein Fehler von Kanthak sein k\u00f6nnen. Daher hat Kanthak bei &lt;libc-maintainers@gnu.org&gt; nachfragt, ob 179 ULP oder 268 ULP als \"a few ulp\" gelten. Darauf wird der franz\u00f6sische Mathematiker <a href=\"https:\/\/en.wikipedia.org\/wiki\/Paul_Zimmermann_(mathematician)\" target=\"_blank\" rel=\"noopener\">Paul Zimmermann<\/a> aufmerksam. Wenn ich es richtig gesehen habe, hat Zimmermann einiges zu Abweichungsfehlern in solchen Bibliotheken geschrieben. Im aktuellen Fall best\u00e4tigt Zimmermann die von Kanthak ermittelten \"groben\" Fehler in den trigonometrischen Funktionen.<\/p>\n<h2>Weitere Tests von Kanthak<\/h2>\n<p>Kanthak hat dann die nat\u00fcrlichen Zahlen 214112296674652 und 1284673780047912 als \"fast Vielfaches\" von pi, pi\/2 oder pi\/4 als sogenannte Konvergenten von pi verwendet. Der Z\u00e4hler\/Numerator des Bruchs 6134899525417045\/1952799169684491, der 105 Bits bzw. 32 Dezimalstellen von pi liefert, ist ein solcher Konvergent. Z\u00e4hler\/Numerator und Nenner\/Denumerator sind kleiner 2**53 und exakt als (doppelt genaue) Gleitpunktzahlen darstellbar.<\/p>\n<p>Der Bruch 5920787228742393\/3769290217798865 liefert 32 Dezimalstellen<br \/>\nvon pi\/2, der Bruch 6027843377079719\/7674888557167847 liefert 32 Dezimalstellen<br \/>\nvon pi\/4.<\/p>\n<p>Kanthak hat (der Einfachheit halber) nur Werte kleiner 2**53 = 0x1.0p+53 =<br \/>\n9007199254740992 verwendet, die als Gleitpunktzahlen EXAKT darstellbar<br \/>\nsind. Es gibt diese auch gr\u00f6\u00dfer als 2**53. Dabei laufen die ULPs \"weg, z.B. liefert:<\/p>\n<ul>\n<li>sin(0x1.4c96c11134d36p+578) einen Fehler von 102825 ULP,<\/li>\n<li>cos(0x1.69eab0985179bp+246) einen Fehler von 136921 ULP,<\/li>\n<li>tan(0x1.69eab0985179bp+246) einen Fehler von 143270 ULP<\/li>\n<\/ul>\n<p>Das ist also mehr als das 10000-Fache dessen, was GNU als fehlerhaft betrachtet, bzw. das ist das 286000-Fache dessen, was die oben erw\u00e4hnten Mathematiker als \"gr\u00f6\u00dften gefundenen Fehler\" in der Bibliothek angeben. Klingt nicht gut.<\/p>\n<p>Nachtrag: Die libc-Maintainer haben Kanthak inzwischen mitgeteilt, dass sie diesen seit 2013 vorhandenen Fehler (in einer von IBM eingereichten Routine) in der im Oktober 2026 kommenden Version 2.44 behoben haben (siehe <a href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=15267\" target=\"_blank\" rel=\"noopener\">Bug 15267<\/a> und <a href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=34376\" target=\"_blank\" rel=\"noopener\">Bug 34376<\/a>).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Stefan Kanthak hat mich vor einigen Tagen auf unsch\u00f6ne Fehler in der GNU libc aufmerksam gemacht. Trigonometrische Berechnungen f\u00fchren zu fehlerhaften Werten, die weit oberhalb dessen liegen, was Mathematiker als Abweichungen gefunden und best\u00e4tigt haben.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8537,7459],"tags":[24,3836],"class_list":["post-327626","post","type-post","status-publish","format-standard","hentry","category-problem","category-software","tag-problem","tag-software"],"_links":{"self":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/327626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/comments?post=327626"}],"version-history":[{"count":7,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/327626\/revisions"}],"predecessor-version":[{"id":327733,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/327626\/revisions\/327733"}],"wp:attachment":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/media?parent=327626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/categories?post=327626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/tags?post=327626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}