這取決於你的意思是「精確度」。
浮點數有「常規」(正常)值,但也有特殊的子正常數。如果要找出不同的限制,C標準具有預定義的常量:
#include <math.h>
#include <stdio.h>
#include <float.h>
int main(void)
{
printf("%30s: %g\n", "FLT_EPSILON", FLT_EPSILON);
printf("%30s: %g\n", "FLT_MIN", FLT_MIN);
printf("%30s: %g\n", "nextafterf(0.0, 1.0)", nextafterf(0.0, 1.0));
printf("%30s: %g\n", "nextafterf(1.0, 2.0)-1", (nextafterf(1.0, 2.0) - 1.0f));
puts("");
printf("%30s: %g\n", "DBL_EPSILON", DBL_EPSILON);
printf("%30s: %g\n", "DBL_MIN", DBL_MIN);
printf("%30s: %g\n", "nextafter(0.0, 1.0)", nextafter(0.0, 1.0));
printf("%30s: %g\n", "nextafter(1.0, 2.0)-1", (nextafter(1.0, 2.0) - 1.0));
puts("");
printf("%30s: %Lg\n", "LDBL_EPSILON", LDBL_EPSILON);
printf("%30s: %Lg\n", "LDBL_MIN", LDBL_MIN);
printf("%30s: %Lg\n", "nextafterl(0.0, 1.0)", nextafterl(0.0, 1.0));
printf("%30s: %Lg\n", "nextafterl(1.0, 2.0)-1", (nextafterl(1.0, 2.0) - 1.0));
return 0;
}
上述程序打印紙4點的值對於每種類型:
- 和至少值1之間的差大於1在該類型(TYPE
_EPSILON
),在給定類型(TYPE _MIN
)
- 最小正歸一化值。這不包括subnormal numbers,
- 給定類型的最小正值(
nextafter
* (0
... )
)。這包括次正態數字,
- 大於1的最小數字。這與類型相同
_EPSILON
,但以不同方式計算。
根據「精度」的含義,以上任何一項或任何一項都不會對您有用。
下面是上述程序的我的電腦上輸出:
FLT_EPSILON: 1.19209e-07
FLT_MIN: 1.17549e-38
nextafterf(0.0, 1.0): 1.4013e-45
nextafterf(1.0, 2.0)-1: 1.19209e-07
DBL_EPSILON: 2.22045e-16
DBL_MIN: 2.22507e-308
nextafter(0.0, 1.0): 4.94066e-324
nextafter(1.0, 2.0)-1: 2.22045e-16
LDBL_EPSILON: 1.0842e-19
LDBL_MIN: 3.3621e-4932
nextafterl(0.0, 1.0): 3.6452e-4951
nextafterl(1.0, 2.0)-1: 1.0842e-19
不浮動有23位尾數?你爲什麼期望2^-64? – Rup 2010-08-13 16:19:37