Floating point 从浮点转换为整数时的不同值
这是我的密码:Floating point 从浮点转换为整数时的不同值,floating-point,type-conversion,integer,Floating Point,Type Conversion,Integer,这是我的密码: #include <stdio.h> int main() { float dt = 0.0002, t0; int it0; for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) { it0 = (int)(t0/dt); printf("t0 = %f, it0 = %d\n",t0,i
#include <stdio.h>
int main()
{
float dt = 0.0002, t0;
int it0;
for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) {
it0 = (int)(t0/dt);
printf("t0 = %f, it0 = %d\n",t0,it0);
}
return 0;
}
当t0=0.053200
时,it0
应为266
(0.0532/0.0002=266)。但这里显示的是it0=265
。为了调查原因,我独立运行t0=0.053200
,如下所示:
#include <stdio.h>
int main()
{
float dt = 0.0002, t0 = 0.0532;
int it0;
it0 = (int)(t0/dt);
printf("t0 = %f, it0 = %d\n",t0,it0);
return 0;
}
我不知道为什么会这样。所以我做了另一个测试,使用下面的代码打印浮点(转换前)和整数(转换后):
#include <stdio.h>
int main()
{
float dt = 0.0002, t0, test;
int it0;
for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) {
it0 = (int)(t0/dt);
test = t0/dt;
printf("t0 = %f, it0 = %d / %f\n",t0,it0,test);
}
return 0;
}
我注意到
t0=0.053200,it0=265/265.999969
。我猜转换为整数会使265.999969
成为一个错误的数字,即265
。您知道如何解决这个问题吗?以下假设我们的C实现使用IEEE-754 binary32格式表示浮点
,使用binary64格式表示双精度
,这是非常可能的
在
for(t0=0.0512;t0尝试it0=(int)(t0/dt);
-->it0=(int)轮(t0/dt);
这是否回答了您的问题?
t0 = 0.053200, it0 = 266
#include <stdio.h>
int main()
{
float dt = 0.0002, t0, test;
int it0;
for ( t0 = 0.0512; t0 <= 0.0544; t0 += 0.0004 ) {
it0 = (int)(t0/dt);
test = t0/dt;
printf("t0 = %f, it0 = %d / %f\n",t0,it0,test);
}
return 0;
}
t0 = 0.051200, it0 = 256 / 256.000000
t0 = 0.051600, it0 = 258 / 258.000000
t0 = 0.052000, it0 = 260 / 260.000000
t0 = 0.052400, it0 = 262 / 262.000000
t0 = 0.052800, it0 = 264 / 264.000000
t0 = 0.053200, it0 = 265 / 265.999969
t0 = 0.053600, it0 = 267 / 267.999969
t0 = 0.054000, it0 = 269 / 269.999969
t0 = 0.054400, it0 = 271 / 271.999969
t0 = 0.0511999987065792083740234375, it0 = 256
t0 = 0.0515999980270862579345703125, it0 = 258
t0 = 0.0519999973475933074951171875, it0 = 260
t0 = 0.0523999966681003570556640625, it0 = 262
t0 = 0.0527999959886074066162109375, it0 = 264
t0 = 0.0531999953091144561767578125, it0 = 265
t0 = 0.0535999946296215057373046875, it0 = 267
t0 = 0.0539999939501285552978515625, it0 = 269
t0 = 0.0543999932706356048583984375, it0 = 271
t0*2^28 = 13743895, it0 = 256
t0*2^28 = 13851269, it0 = 258
t0*2^28 = 13958643, it0 = 260
t0*2^28 = 14066017, it0 = 262
t0*2^28 = 14173391, it0 = 264
t0*2^28 = 14280765, it0 = 265
t0*2^28 = 14388139, it0 = 267
t0*2^28 = 14495513, it0 = 269
t0*2^28 = 14602887, it0 = 271