5456.367 -> 5456.367188。这是因为 c 中的浮点精度吗?
5456.367 -> 5456.367188. Is this because float precision in c?
我有一个这样的 C 程序:
#include <stdio.h>
int main() {
float number = 0;
scanf("%f", &number);
printf("%f\n", number);
}
输出为:
ururay@note:~/workspace/c/float-precision$ gcc float-precision.c -o float-precision
ururay@note:~/workspace/c/float-precision$ ./float-precision
5456.367
5456.367188
这个程序我已经执行了好几次了,结果都是一样的。 “188”是否因为浮点精度而“附加”到数字的末尾?如果是这样,我如何以二进制表示形式识别它?
是的,如果你想要更好的精度,请尝试使用 double
或 long double
(但 long double
比其他类型慢得多,或者引用与 double
相同的类型).
另外printf只需要double
和long double
去看看the spec of printf
数字 5456.367
无法在 IEEE-754 单精度浮点格式中准确表示。
最接近的数字是 5456.3671875
,它的二进制表示形式是 01000101101010101000001011110000
。下一个较小的可表示数是 5456.3666992
,它具有二进制表示 01000101101010101000001011101111
.
我有一个这样的 C 程序:
#include <stdio.h>
int main() {
float number = 0;
scanf("%f", &number);
printf("%f\n", number);
}
输出为:
ururay@note:~/workspace/c/float-precision$ gcc float-precision.c -o float-precision
ururay@note:~/workspace/c/float-precision$ ./float-precision
5456.367
5456.367188
这个程序我已经执行了好几次了,结果都是一样的。 “188”是否因为浮点精度而“附加”到数字的末尾?如果是这样,我如何以二进制表示形式识别它?
是的,如果你想要更好的精度,请尝试使用 double
或 long double
(但 long double
比其他类型慢得多,或者引用与 double
相同的类型).
另外printf只需要double
和long double
去看看the spec of printf
数字 5456.367
无法在 IEEE-754 单精度浮点格式中准确表示。
最接近的数字是 5456.3671875
,它的二进制表示形式是 01000101101010101000001011110000
。下一个较小的可表示数是 5456.3666992
,它具有二进制表示 01000101101010101000001011101111
.