我試圖解決一個耦合一階微分方程使用4點距離 - 庫塔方法。當輸出m
的值時,出現-1.#IND0
錯誤。我知道這可能是NaN,但它對我來說沒有意義,因爲m
的值應該增加,並且我得到-1IND0
之間的有效值。這裏是我的輸出樣本:-1。#IND0錯誤使用範圍庫塔方法在C
3110047776596300800000000000000000000.00000 35953700.00
-1.#IND0 35984000.00
-1.#IND0 36013700.00
3721056749337648900000000000000000000.00000 36042800.00
-1.#IND0 36071400.00
4132402773947312100000000000000000000.00000 36099500.00
-1.#IND0 36127200.00
4546861919240663800000000000000000000.00000 36154400.00
這裏是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pi 3.141592654
double f(double p, double m, double r)
{
return -0.000000000000000012812899255404507 * m * pow(p, 1.0/3)/(r * r);
}
double g(double p, double r)
{
return 4 * pi * r * r * p;
}
int main()
{
double p_c, //central density
p, //densities
m, //masses
f_val[4], //arrayed f
g_val[4], //arrayed g
r = 1e-15, //radius
dr = 100, //radius increment
p_0 = 0.001; //effective zero density
double p_min = 1e6;
double p_max = 1e14;
int i; //Loop counter
FILE *data=fopen("dwarf.txt", "w");//Output file
for(p_c = p_min; p_c <= p_max; p_c += (p_max - p_min)/100)
{
p = p_c;
m = (4.0/3) * pi * r * r * r * p_c;
while(p > p_0)
{
//fprintf(data, "%.5lf %.2lf %.2lf\n", p, m, r);
f_val[0] = f(p, m, r) * dr;
g_val[0] = g(p, r) * dr;
f_val[1] = f(p + f_val[0]/2, m + g_val[0]/2, r + dr/2) * dr;
g_val[1] = g(p + f_val[0]/2, r + dr/2) * dr;
f_val[2] = f(p + f_val[1]/2, m + g_val[1]/2, r + dr/2) * dr;
g_val[2] = g(p + f_val[1]/2, r + dr/2) * dr;
f_val[3] = f(p + f_val[2], m + g_val[2], r + dr) * dr;
g_val[3] = g(p + f_val[2], r + dr) * dr;
m += (g_val[0] + 2 * g_val[1] + 2 * g_val[2] + g_val[3])/6;
p += (f_val[0] + 2 * f_val[1] + 2 * f_val[2] + f_val[3])/6;
r += dr;
}
fprintf(data, "%.5lf %.2lf\n", m, r);
printf("%.5lf %.2lf\n", m, r);
}
exit;
}
'-0.000000000000000012812899255404507'這完全是16位有效數字。這個標準('double')文字將支持這種精度的每一點並不明顯。使用'-0.000000000000000012812899255404507L'會在'long double'長度超過'double'的平臺上獲得更多信息。 (你可能會也可能不想要,這取決於...) – dmckee
嗯......而你只定義了pi到10個有效數字,所以額外的f是零。考慮'const double pi = 4.0 * atan(1.0)'。 – dmckee
考慮使用long double。 – askmish