Ich versuche, über Gleitkomma-Genauigkeit in C zu lernen. Ich stieß auf dieses Problem beim Experimentieren mit Förderung und Herabstufung in math.h Funktionen.zurück mit langen Doppel mit math.h Funktionen
Im folgenden Programm bekomme ich ein -nan für die erste Gleichung mit langen Doppel und ein Ergebnis für die zweite. Ich verstehe nicht warum. Wenn pow(x,y)
mit langen Doppel ein -nan zurückgibt, warum gibt (pow(x,y) - z)
mit langen Doppel das richtige Ergebnis zurück?
#include <stdio.h>
#include <math.h>
/* equation from xkcd: e to the pi minus pi is 19.999099979 */
int main(void)
{
printf("f %#.9f\n",
pow(2.71828182846F, 3.14159265359F));
printf("f %#.9f\n",
pow(2.71828182846F, 3.14159265359F) - 3.14159265359F);
printf("d %#.9lf\n",
pow(2.71828182846, 3.14159265359));
printf("d %#.9lf\n",
pow(2.71828182846, 3.14159265359) - 3.14159265359);
printf("ld %#.9Lf\n",
pow(2.71828182846L, 3.14159265359L));
printf("ld %#.9Lf\n",
pow(2.71828182846L, 3.14159265359L) - 3.14159265359L);
return 0;
}
output:
f 23.140692448
f 19.999099707
d 23.140692633
d 19.999099979
ld -nan
ld 19.999099979
Die 'pow' Funktion gibt ein Ergebnis vom Typ' doppeltes ". Sie können das Ergebnis in 'long double' umwandeln, aber für die meisten Zwecke wäre es besser,' powl' aufzurufen, die ein Ergebnis vom Typ 'long double' zurückliefern. –
@paxdiablo: Ich sehe jetzt. Ich habe verstanden, dass pow die langen Doppel die Berechnung reduziert hat, aber vergessen das Ergebnis ist auch ein Doppel. Es arbeitet mit dem Minus-Teil der Gleichung, weil das Pow-Ergebnis dann in dieser Berechnung gefördert wird. Danke für Ihre Antwort. Und jetzt ab, um mehr über Casting zu lernen :) – rsarson
Ist es wert zu erwähnen '', oder ist das Stück schwarze Magie am besten in den Schatten gelassen? –