我正在嘗試使用C語言學習浮點精度。在math.h函數中嘗試升級和降級時遇到此問題。nan用math.h函數返回long long double函數
在下面的程序中,我得到了第一個使用長雙打和第二個結果的第一個等式。我不懂爲什麼。如果帶長雙打的pow(x,y)
返回一個-nan,爲什麼(pow(x,y) - z)
有長雙打會返回正確的結果?
#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
的'pow'函數返回類型的'結果double'。您可以將結果轉換爲「long double」,但對於大多數用途,最好調用'powl',它返回'long double'類型的結果。 –
@paxdiablo:我明白了。我理解戰俘降級長雙打計算,但忘記了返回的結果也是一個雙。它與等式的負數部分一起工作,因爲在該計算中pow函數的結果會被提升。感謝回覆。現在關閉瞭解更多關於鑄造:) – rsarson
值得一提的是'',還是那塊黑魔法最好留在陰影裏? –