C++ 中的双精度,308 位还是 15 位?
double precision in C++, 308 digits or 15 digits?
如果double最多可以表示3.4E308(308个0)的值,那为什么说double只能存储15位呢?说“308的十次方”有什么意义?
我们不说“double
只存储15位数字”。我们说“double
有 15 位精度”。这意味着 double
的计算值,当打印为以 10 为基数的数字序列时,仅精确到这 15 位数字。
double
可以表示3.4E308
。是的,要打印它,您需要 15 位以上的精度。由于 floating-point 实施,某些特定值具有这些保证。 但是,例如,一个数字3.4E308 - 1
,是在double
的范围内,不能 准确地 表示为 double
.
如果要确定,直接取double
的前15位即可。有些值可以用 15 位以上的数字正确表示,但有些则不能。 double
范围 中的每个值都将 正确表示到其十进制表示形式的第 15 位。
为了帮助简单理解这一点,请考虑可以表示以下数字的数字类型:
-100000
-100
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+100
+100000
该类型最多可表示 100000 个数字。此类型的精度是 6 位还是 1 位?
如果double最多可以表示3.4E308(308个0)的值,那为什么说double只能存储15位呢?说“308的十次方”有什么意义?
我们不说“double
只存储15位数字”。我们说“double
有 15 位精度”。这意味着 double
的计算值,当打印为以 10 为基数的数字序列时,仅精确到这 15 位数字。
double
可以表示3.4E308
。是的,要打印它,您需要 15 位以上的精度。由于 floating-point 实施,某些特定值具有这些保证。 但是,例如,一个数字3.4E308 - 1
,是在double
的范围内,不能 准确地 表示为 double
.
如果要确定,直接取double
的前15位即可。有些值可以用 15 位以上的数字正确表示,但有些则不能。 double
范围 中的每个值都将 正确表示到其十进制表示形式的第 15 位。
为了帮助简单理解这一点,请考虑可以表示以下数字的数字类型:
-100000
-100
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+100
+100000
该类型最多可表示 100000 个数字。此类型的精度是 6 位还是 1 位?