在 C 中,float 或 double 类型是如何工作的?
In C how float or double type works exactly?
现在大学在学C。我在 float 类型中发现了意外行为。
这是示例代码:
#include <stdio.h>
int main(void) {
float f = 100.0/3;
printf("%.20f", f);
}
真实结果是 33.3(有 3 个周期)。我也知道机器只能存储有理数,对我来说没问题,所以我预期的答案可能是:
- 33.33333200000000000000(四舍五入)
最多
- 33.33333400000000000000(四舍五入)
- 33.33333200000000000000(向下舍入)
- 33.33333000000000000000(刚刚截断)
但是执行后(用GCC编译)结果是33.33333206176757800000...
2后面的数字(061767578)我脑子里想不通
为什么会出现这种行为?我搜索了很多,我一无所获:(
要查看存储的确切值,您应该打印 20 多位数字。该数字应以 75000…
或 25000…
.
结尾
假设您正在使用 IEEE 754 的实现,每个 float
的形式为 num / den
,其中 num
有 24 个二进制 (!) 数字和 den
是 2 的幂。(非规范化数字除外,但那是另一个话题。)
现在大学在学C。我在 float 类型中发现了意外行为。
这是示例代码:
#include <stdio.h>
int main(void) {
float f = 100.0/3;
printf("%.20f", f);
}
真实结果是 33.3(有 3 个周期)。我也知道机器只能存储有理数,对我来说没问题,所以我预期的答案可能是:
- 33.33333200000000000000(四舍五入)
最多
- 33.33333400000000000000(四舍五入)
- 33.33333200000000000000(向下舍入)
- 33.33333000000000000000(刚刚截断)
但是执行后(用GCC编译)结果是33.33333206176757800000...
2后面的数字(061767578)我脑子里想不通
为什么会出现这种行为?我搜索了很多,我一无所获:(
要查看存储的确切值,您应该打印 20 多位数字。该数字应以 75000…
或 25000…
.
假设您正在使用 IEEE 754 的实现,每个 float
的形式为 num / den
,其中 num
有 24 个二进制 (!) 数字和 den
是 2 的幂。(非规范化数字除外,但那是另一个话题。)